一、什么是请求钩子?
1.请求钩子的含义
有时在处理请求之前或之后执行代码会很有用,在Django中学的中间件类似。
例如,在请求开始时,我们可能需要创建数据库连接或认证发起请求的用户。
为了避免在每个视图函数中都使用重复的代码,Flask提供了注册通用函数功能,注册的函数可在请求被分发到视图函数之前或之后调用。
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
-
before_first_request
: 注册一个函数,在处理第一个请求前运行
@app.before_first_request
-
before_request
:注册一个函数,在每次请求前运行
@app.before_request
-
after_request(response)
:如果没有未处理的异常抛出,在每次请求后运行
@app.after_request
-
teardown_request(response)
:在每次请求后运行,即使有未处理的异常抛出,仍然运行
注意: 只是在debug=False的时候才会出现,如果为True,不会走这个方法。
@app.teardown_request
2. 请求钩子和视图函数共享数据
请求钩子和视图函数之间共享数据一般使用 上下文全局变量:g
。
例如,
before_request
处理程序可以从数据库中加载已登录用户,并将其保存到g.user
中。随后调用视图函数时,视图函数再使用g.user
获取用户。
二、请求钩子举例
可以通过request
来获取请求,来区分请求钩子的执行,这种使用钩子的情况比较少,但是比较麻烦
@app.before_request
def handle_before_request():
'''在第一次请求处理之前先被执行'''
path = request.path
if path == url_for("index"):
print("在请求钩子中判断请求的视图逻辑")
elif path == url_for('hello'):
print('在hello中判断请求的逻辑')
print("handle_before_reques被执行")
@app.before_request
def handle_before_request():
'''在第一次请求处理之前先被执行'''
path = request.path
if path in [url_for("index"), url_for("hello")]:
print("在请求钩子中判断请求的视图逻辑")
elif path == url_for('hello'):
print('在hello中判断请求的逻辑')
print("handle_before_reques被执行")
网友评论