from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World"
if __name__ == "__main__":
app.run()
当程序运行时,执行app.run(),会先执行Flask.__call__方法
def __call__(self, environ, start_response):
"""Shortcut for :attr:`wsgi_app`."""
return self.wsgi_app(environ, start_response)
call方法中调用Flask.wsgi_app方法
def wsgi_app(self, environ, start_response):
ctx = self.request_context(environ) # 获取environ中的信息,封装在request和session中
ctx.push() # 放在Local中的__storage__字典中,字典格式为{"stack":[ctx, ]} 此处stack中存放的为列表形式==栈,详细信息查看文章《Flask多app应用之“栈”详解》
error = None
try:
try:
response = self.full_dispatch_request() # 请求
except Exception as e:
error = e
response = self.handle_exception(e) # 报错
except:
error = sys.exc_info()[1]
raise
return response(environ, start_response) # response
finally:
if self.should_ignore_error(error):
error = None
ctx.auto_pop(error) # 请求结束,删除__storage__中信息
深入ctx = request_context(environ)
def request_context(self, environ):
return RequestContext(self, environ) # self为Flask对象=app,environ为请求信息
所以此处ctx为RequestContext对象!
接着我们来看RequestContext中都封装了些什么:
深入Request Context(self, environ)
源码可见,RequestContext中封装了我们用到的reqeust,session,so:request = ctx.request , session = ctx.reqeust
class RequestContext(object):
def __init__(self, app, environ, request=None):
self.app = app
if request is None:
request = app.request_class(environ)
self.request = request # request字段
self.url_adapter = app.create_url_adapter(self.request)
self.flashes = None
self.session = None # session字段
self._implicit_app_ctx_stack = []
self.preserved = False
self._preserved_exc = None
self._after_request_functions = []
self.match_request(