使用Flask框架时,Flask是首要入口,使用方法类似下面:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
pass
if __name__ == '__main__':
app.run(debug=True)
Flask.run()方法核心就是werkzeug库的run_simple()方法,请参考另外一篇文章分析
Flask类定义如下图所示:
其中,方法wsgi_app是由HTTPServer进行回调的方法,由另外文章分析可知,HTTPServer套接字有网络请求时,最终会调用到到这个方法,所以这里是Flask处理的核心
def wsgi_app(self, environ, start_response):
ctx = self.request_context(environ)
ctx.push()
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)
finally:
if self.should_ignore_error(error):
error = None
ctx.auto_pop(error)
首先,生成一个请求下上文对象,该对象保存了Flask实例、环境信息
其次,上下文对象放入公共栈中,这个栈以协程/线程ID隔离。
然后,处理该请求且没有一次发生,则生成一个Response返回
以上就是处理的基本框架。还有很多细节需要逐步分析才能明了
处理请求过程中,会依次执行before_first_request_funcs--》url_value_preprocessors--》before_request_funcs--》view_functions--》after_request_funcs列表中的函数。
before_first_request_funcs:初始化为空列表[],用户自定义方法时,直接将函数添加到列表中。函数类型def func()
url_value_preprocessors:初始化为空字典{},用户添加自定义方法时,url_value_preprocessors值变为{None: []},所有的方法都添加到None数组中。方法类型为:def func(endpoint, *args)
before_request_funcs:初始化为空字典{},用户添加自定义方法时,before_request_funcs值变为{None: []},所有的方法都添加到None数组中。方法类型为def func()
after_request_funcs:初始化为空字典{},用户添加自定义方法时,after_request_funcs值变为{None: []},所有的方法都添加到None数组中。方法类型为def func(response)