Flask學習-Flask app啟動過程

來源:互聯網
上載者:User

標籤:else   添加   tor   包名   lob   temp   url   步驟   錯誤處理   

因為0.1版本整體代碼大概只有350行,比較簡單。所以本篇文章會以Flask 0.1版本源碼為基礎進行剖析Flask應用的啟動過程。

Flask參考資料flask,官網有一個最簡單app:

from flask import Flaskapp = Flask(__name__)@app.route(‘/hello‘)def hello_world():    return ‘Hello World!‘if __name__ == ‘__main__‘:    app.run(host=‘0.0.0.0‘, port=8080,debug=True)

  

下面就以上面這個最簡單的Flask app為起點,以v0.1版本源碼為核心進行說明整個Flask應用的啟動過程:

一、初始化App
from flask import Flask    #匯入Flask類app = Flask(__name__)  #1、執行個體化Flask app

  

flask.py檔案:

1.1、定義類變數
class Flask(object):‘‘‘全域變數‘‘‘    request_class = Request    response_class = Response    static_path = ‘/static‘    secret_key = None    session_cookie_name = ‘session‘    jinja_options = dict(        autoescape=True,        extensions=[‘jinja2.ext.autoescape‘, ‘jinja2.ext.with_‘]    )

  

1.2、初始化建構函式
def __init__(self, package_name):        self.debug = False   #debug變數為False        self.package_name = package_name  #一般為__name__,如果以本模組運行,則為__main__;如果是被調用,則為app檔案名稱。        self.root_path = _get_package_path(self.package_name)  #擷取app的絕對路徑        self.view_functions = {}  #視圖函數        self.error_handlers = {}  #錯誤處理        self.before_request_funcs = []  #HTTP請求之前需要執行的函數        self.after_request_funcs = []   #HTTP請求結束之後,需要執行的函數        self.template_context_processors = [_default_template_ctx_processor]  #上下文模板變數:session、g、request        self.url_map = Map()  #url集合
if self.static_path is not None: #self.static_path預設值為‘/static‘,所以預設會把它加入到url_map集合中。Map([<Rule ‘/static/<filename>‘ -> static>]) self.url_map.add(Rule(self.static_path + ‘/<filename>‘, build_only=True, endpoint=‘static‘)) if pkg_resources is not None: target = (self.package_name, ‘static‘) else: target = os.path.join(self.root_path, ‘static‘) self.wsgi_app = SharedDataMiddleware(self.wsgi_app, { self.static_path: target }) self.jinja_env = Environment(loader=self.create_jinja_loader(), **self.jinja_options) self.jinja_env.globals.update( url_for=url_for, get_flashed_messages=get_flashed_messages )

  

在建構函式中,主要定義了一些變數(debug、包名、包路徑、視圖函數、上下文相關、路由、static路徑、模板相關環境)

 

二、路由處理
@app.route(‘/hello‘)def hello_world():    return ‘Hello World!‘

  

flask.py檔案

2.1 定義路由裝飾器

功能就是完成url_map和view_functions的初始化,其中Rule是werkzeug提供的工具。

def route(self, rule, **options):        def decorator(f):            self.add_url_rule(rule, f.__name__, **options)  #Map([<Rule ‘/hello‘(HEAD,GET) -> hello_world>])            self.view_functions[f.__name__] = f    #view_functions = {‘hello_world‘:hello_world}            return f        return decorator
def add_url_rule(self, rule, endpoint, **options): options[‘endpoint‘] = endpoint options.setdefault(‘methods‘, (‘GET‘,)) self.url_map.add(Rule(rule, **options))

  

三、app.run()

前面兩個步驟,都是初始化操作,為後續啟動做準備。包括初始化環境變數和路由添加。

if __name__ == ‘__main__‘:    app.run(host=‘0.0.0.0‘, port=8080,debug=True)

  

app正式啟動了。過程如下:

flask.run()    --> werkzeug.run_simple()    -->  werkzeug.inner()       --> werkzeug.serving.make_server()         -->serve_forever()           -->SocketServer.BaseServer.HTTPServer.serve_forever()  #While True:****

  

 至此,一個flask的app已經跑起來了。

Flask學習-Flask app啟動過程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.