关于Flask 上下文详细介绍
作者:tigeriaf
1、上下文概念
上下文,说白了就是所谓的语境,就是语言环境。比如单独拎出来一篇文章的某一句话,我们可能不能理解它的意思,但是通过这句话所处的语言环境,再结合它前后的语句,就能很轻易的理解。
我们可以把上下文理解为当前环境的快照,是一个用来保存状态的对象。在代码执行的某个时刻,根据上下文的代码逻辑,可以决定在当前时刻下使用到的环境变量等。
2、Flask中的上下文
Flask
中有两种上下文,应用上下文(application context
)和请求上下文(request context
):
application
:指的是调用app = Flask(__name__)
创建的Flask
对象request
:指的是每次HTTP
请求发生时,在Flask
对象内部创建的Request
对象
2.1请求上下文
在Flask
中处理请求时,应用会生成“请求上下文”对象,保存当前请求的相关数据信息,整个请求的处理过程,都会在这个上下文对象中进行,保证请求的处理过程独立不受干扰。
请求上下文对象有:request
和session
,下面以request
为例具体讲解。
在上篇文章Flask 请求钩子的实现 我们说过,在 Flask
中有四种常用的请求钩子,分别是:before_first_request
、before_request
、after_request
和teardown_request
。
@app.before_first_request def before_first_request(): print(request.url) print('before_first_request') @app.before_request def before_request(): print(request.url) print('before_request') @app.after_request def after_request(response): print(request.url) print('after_request') return response @app.teardown_request def teardown_request(e): print(request.url) print('teardown_request') @app.route('/test') def test(): print(request.url) return 'test'
通过请求我们发现,在每个请求钩子装饰的处理函数中,我们都可以直接访问 request
对象。而且,在其他普通函数内,无法访问 request
对象,说明 request
对象并不是真正的全局变量,只是在请求上下文的生命周期内可以访问,离开了请求的生命周期,就无法访问了。上面的请求钩子装饰的处理函数,在请求处理的不同阶段执行,自然其内部也可以访问 request
对象。
2.2应用上下文
上面说请求上下文是和请求相关,请求上下文对象保存的是请求的相关数据信息,下面说一下应用上下文,所谓应用上下文,就是和当前应用相关的,应用上下文对象是包含当前应用相关的信息。
应用上下文对象有:current_app
和g
。
我们了解到,每个请求,都有一个 request
对象和视图函数对应,可以理解为当前请求(current request
), 而程序也会有多个实例的情况,为了能获取对应的程序实例,而不是固定的某一个程序实例,我们就需要使用 current_app
变量。
from flask import Flask, current_app app = Flask("tigeriaf_app") @app.route('/') def index(): return 'Hello, {}!'.format(current_app.name)
current_app
是一个本地代理,它的类型是werkzeug.local.LocalProxy
,它所代理的即是app
对象,也就是说current_app == LocalProxy(app)
。所以通过current_app.name
可以获取当前应用的名称,也就是tigeriaf_app
,使用current_app
是因为它也是一个ThreadLocal
变量,对它的改动不会影响到其他线程。我们可以通过current_app._get_current_object()
方法来获取app对象。也可以在current_app
中存储一些自定义的变量。
current_app
只在请求线程内存在,它的生命周期就是在应用上下文里。离开了应用上下文,current_app
一样无法使用。
g
对象是 Flask
程序全局的一个临时变量,充当中间媒介的作用。我们可以通过它传递一些数据,g保存的是当前请求的全局变量,每次请求都会重设这个值,我们通常会使用它结合请求钩子来保存每个请求处理前所需要的全局变量,比如当前登入的用户对象,数据库连接等。 比如,使用g对象保存请求的 token
,在视图函数中就可以直接使用g.name
获取对应的值了。
from flask import g @app.before_request def get_token(): g.name = request.headers.get("token")
到此这篇关于 关于Flask 上下文详细介绍的文章就介绍到这了,更多相关Flask 上下文内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!