在客户端和服务器交互过程中,有些准备工作或者扫尾工作需要处理。比如:
1.在请求开始时,建立数据库连接;
2.在请求开始时,根据需求进行全年校验。
3.在请求你结束时,指定数据的交互格式。
为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设置等功能,即请求钩子。
请求钩子是通过装饰器的形式实现,Flask支持四种请求钩子:
1.before_first_request
在处理第一个请求前执行
2.before_request
在每次请求前执行;如果在某修饰的函数中返回了一个相应,视图函数将不再被调用。
3.after_request
在每次请求后执行(如果没有抛出错误);接收一个参数:视图函数做出的相应,在此函数中可以对响应值在返回之前做最后一步修改处理,需要将参数中的相应在此参数中进行返回。
4.teardown_request
在每次请求后执行;接收一个参数:错误信息,如果有相关错误抛出,需要设置flask的配置DEBUG=False,teardown_request才会接收到异常对象。
from flask import Flask
from settings.dev import DevConfig
app = Flask(__name__)
# 项目配置
app.config.from_object(DevConfig)
@app.before_first_request
def before_first_request():
print("----before_first_request----")
print("系统初始化的时候,执行这个钩子方法")
print("会在接收到第一个客户端请求时,执行这里的代码")
@app.before_request
def before_request():
print("----before_request----")
print("每一次接收到客户端请求时,执行这个钩子方法")
print("一般可以用来判断权限,或者转换路由参数或者预处理客户端请求的数据")
@app.after_request
def after_request(response):
print("----after_request----")
print("在处理请求以后,执行这个钩子方法")
print("一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作")
response.headers["Content-Type"] = "application/json"
# 必须返回response参数
return response
@app.teardown_request
def teardown_request(exc):
print("----teardown_request----")
print("在每一次请求以后,执行这个钩子方法,如果有异常错误,则会传递错误异常对象到当前方法的参数中")
print(exc)
@app.route("/")
def index():
print("----视图函数----")
print("视图函数被运行了")
return "视图函数被运行了<br>"
if __name__ == '__main__':
app.run(host="0.0.0.0", port=80)
- 在第1次请求时的打印:
----before_first_request----
系统初始化的时候,执行这个钩子方法
会在接收到第一个客户端请求时,执行这里的代码
----before_request----
每一次接收到客户端请求时,执行这个钩子方法
一般可以用来判断权限,或者转换路由参数或者预处理客户端请求的数据
----视图函数----
视图函数被运行了
----after_request----
在处理请求以后,执行这个钩子方法
一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作
----teardown_request----
在每一次请求以后,执行这个钩子方法,如果有异常错误,则会传递错误异常对象到当前方法的参数中
None
- 在第2次请求时的打印:
----before_request----
127.0.0.1 - - [08/Apr/2019 09:23:53] "GET / HTTP/1.1" 200 -
每一次接收到客户端请求时,执行这个钩子方法
一般可以用来判断权限,或者转换路由参数或者预处理客户端请求的数据
----视图函数----
视图函数被运行了
----after_request----
在处理请求以后,执行这个钩子方法
一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作
----teardown_request----
在每一次请求以后,执行这个钩子方法,如果有异常错误,则会传递错误异常对象到当前方法的参数中
None
网友评论