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 的引用。