一、请求生命周期
Flask 请求的生命周期涉及到整个处理请求的过程,包括请求的接收、视图函数的执行、响应的生成和发送等。以下是一个简要的 Flask 请求生命周期的概述:
-
WSGI 服务器调用 Flask 对象,该对象调用 Flask.wsgi_app() 。
-
一个 RequestContext 对象被创建,将 WSGI environ 字典转换为一个 Request 对象。它还创建一个 AppContext 对象。
-
app context 被推送,这使得 current_app 和 g 可用。
-
发送 appcontext_pushed 信号。
-
request context 被推送,这使得 request 和 session 可用。
-
会话被打开,使用应用程序的 session_interface ,一 个 SessionInterface 实例,载入所有现存的会话数据。
-
将 URL 与在应用设置期间使用 route() 装饰器注册的 URL 规则进行匹配。如果没有匹配项,则错误(通常是 404 、405 或重 定向)被存储以供以后处理。
-
发送 request_started 信号。
-
调用所有 url_value_preprocessor() 装饰的函数。
-
调用所有 before_request() 装饰的函数。如果有任何返回值,那么就立即被视为响应。
-
如果 URL 在几个步骤前与路由不匹配,则现在会引发该错误。
-
与匹配的 URL 关联的 route() 装饰器视图函数 被调用并返回要用作响应的值。
-
如果到目前为止的任何步骤引发了异常,并且有一个 errorhandler() 装饰器函数与异常类或 HTTP 错误代码匹 配,那么调用它处理错误并返回响应。
-
不管是请求前函数、视图或错误处理程序,都会返回一个响应值,并被转换为 Response 对象。
-
任何 after_this_request() 装饰的函数都会被调用,然后被清除。
-
任何 after_request() 装饰的函数都会被调用,它们可以 修改响应对象。
-
会话被保存,使用应用程序的:attr:~.Flask.session_interface 装饰 函数来持久化任何已修改的会话数据。
-
request_finished 信号被发送。
-
如果到目前为止的任何步骤引发了一个异常,并且没有被错误处理函数处 理,那么现在会被处理。 HTTP 异常会使用对应的状态代码作为响应,其他的异常被转换为一个通用的 500 响应。 got_request_exception 信号被发送。
-
响应对象的状态、头部信息和正文被返回给 WSGI 服务器。
-
任何 teardown_request() 装饰的函数都被调用。
-
request_tearing_down 信号被发送。
-
请求上下文被弹出, request 和 session 不再可用。
-
任何 teardown_appcontext() 的装饰函数都被调用。
-
appcontext_tearing_down 信号被发送。
-
应用上下文被弹出, current_app 和 g 不再可用。
-
appcon