一个请求从 WSGI 入口进来,到响应出去,Flask 内部按什么顺序做了哪些事?这篇用调用记录和源码把整条路径摆出来,再量一下钩子的成本。
wsgi_app
request_context
create_url_adapter
push
app_context
create_url_adapter
push
open_session
match_request
full_dispatch_request
preprocess_request
ensure_sync
my_before
dispatch_request
ensure_sync
index
finalize_request
make_response
process_response
ensure_sync
my_after
save_session
should_set_cookie
pop
do_teardown_request
ensure_sync
my_teardown
pop
do_teardown_appcontext
响应: 200 OK | X-After = 1 | Set-Cookie 存在: True上一篇:Context Local 与线程隔离;下一篇:before_request、after_request、teardown_request。
def __call__(self, environ, start_response):
return self.wsgi_app(environ, start_response)
def wsgi_app(self, environ, start_response):
ctx = self.request_context(environ)
error: BaseException | None = None
try:
try:
ctx.push()
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 "werkzeug.debug.preserve_context" in environ:
environ["werkzeug.debug.preserve_context"](_cv_app.get())
environ["werkzeug.debug.preserve_context"](_cv_request.get())
if error is not None and self.should_ignore_error(error):
error = None
ctx.pop(error) before_request 个数 每个请求(µs)
0 68.0
10 75.0
100 122.6
每增加 1 个空钩子约 0.55 µs