Flask源码

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return "Hello World!"
if __name__ == '__main__':
    app.run()

实例化Flask应用时,会创造一个Jinja环境。
实例化的Flask应用是一个可调用对象。
WSGI规范这个对象以便于服务器或者网关调用。
__call__(environ, start_respose)方法,environ由服务器产生,start_response在服务器中定义。

  • 请求上下文
def wsgi_app(environ, start_response):
    with self.request_context(environ):
        ...

request_context(environ)_RequestContext的实例。
with 语句方法,__enter__, __exit__

class _RequestContext(object):
    """The request context contains all request relevant information.  It is
    created at the beginning of the request and pushed to the
    `_request_ctx_stack` and removed at the end of it.  It will create the
    URL adapter and request object for the WSGI environment provided.
    """
 
    def __init__(self, app, environ):
        self.app = app
        self.url_adapter = app.url_map.bind_to_environ(environ)
        self.request = app.request_class(environ)
        self.session = app.open_session(self.request)
        self.g = _RequestGlobals()
        self.flashes = None
 
    def __enter__(self):
        _request_ctx_stack.push(self)
 
    def __exit__(self, exc_type, exc_value, tb):
        # do not pop the request stack if we are in debug mode and an
        # exception happened.  This will allow the debugger to still
        # access the request object in the interactive shell.
        if tb is None or not self.app.debug:
            _request_ctx_stack.pop()

请求上下文对象会通过local模块,压入栈中。使用with语句结束后,上下文对象被销毁。

  • 应用上下文
    创建 Request_context时,先检查是否另一个栈存在app_context,若无则创建一个。
    离开请求上下文时,先销毁请求上下文,如果需要,再销毁应用上下文。
    应用上下文作用:支持多应用
    应用上下文是包含应用信息的。
    current_app 就是对 _app_ctx_stack.top.app 的引用。

上下文

你可能感兴趣的:(Flask源码)