上接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列表并执行