上接Flask源码分析(一),本节内容主要包括预处理、后处理
在上文hello_world例子基础上做一些修改,增加预处理和后处理函数声明
import flask
app = flask.Flask(__name__)
#新增加预处理
@app.before_request
def before_req():
print "before req"
@app.route("/")
def hello():
return "hello world"
#新增加后处理
@app.after_request
def after_req(response):
print "after req, status_code %s" % response.status_code
return response
if __name__ == "__main__":
app.run()
预处理和后处理逻辑基本一致,先看预处理。
flask.py
def before_request(self, f):
"""Registers a function to run before each request."""
self.before_request_funcs.append(f)
return f
初始化app时将before_request_funcs置为空列表,声明before_req函数时,修饰器其实做的是
before_req = before_request(before_req)
将before_req添加到预处理函数列表中
执行时,在上节中提到过的wsgi_app中提到的preprocess_request
def wsgi_app(self, environ, start_response):
with self.request_context(environ):
#预处理逻辑
rv = self.preprocess_request()
#分发逻辑,上节已分析
if rv is None:
rv = self.dispatch_request()
response = self.make_response(rv)
#后处理逻辑
response = self.process_response(response)
return response(environ, start_response)
def preprocess_request(self):
for func in self.before_request_funcs:
rv = func()
if rv is not None:
return rv
这部分很简单,就是遍历before_request_funcs列表并执行