1.为了避免大良可有可无的参数把视图函数弄得一团糟,Flask使用上下文临时把某些对象变为全局可访问。
上下文(context)分为程序上下文(application)和请求(request context)上下文。
变量名 | 上下文 | 说 明 |
---|---|---|
current_app | 程序上下文 | 当前激活程序的程序实例 |
g | 程序上下文 | 处理请求时用作临时存储的对象。每次请求都会重设这个变量 |
request | 请求上下文 | 请求对象,封装了客户端发出的HTTP请求中的内容 |
session | 请求上下文 | 用户会话,用于存储请求之间需要“记住”的值的词典 |
程序上下文被推送后,就可以在线程中使用current_app和g变量。同样,请求上下文被推送后,就可以使用request和session变量。
这里需要通俗地解释一下application context与request context:
- application 指的就是当你调用
app = Flask(__name__)
创建的这个对象app; - request 指的是每次http请求发生时,
WSGI server
(比如gunicorn)调用Flask.__call__()
之后,在Flask对象内部创建的Request
对象; - application 表示用于响应WSGI请求的应用本身,request 表示每次http请求;
- application的生命周期大于request,一个application存活期间,可能发生多次http请求,所以,也就会有多个request
2.源码
class Flask(object):
def request_context(self, environ):
"""Creates a request context from the given environment and binds
it to the current context. This must be used in combination with
the `with` statement because the request is only bound to the
current context for the duration of the `with` block.
Example usage::
with app.request_context(environ):
do_something_with(request)
:params environ: a WSGI environment
"""
return _RequestContext(self, environ)
在Flask类中,每次请求都会调用这个request_context函数。这个函数则会创建一个_RequestContext对象。
class _RequestContext</