外观
请求钩子
我们有时会对请求进行预处理和后处理,这时可以使用Flask框架的请求钩子Hook,以注册在请求处理的不同阶段执行的处理函数。Flask的请求钩子是在执行视图函数前后执行的函数,用户可以在这些函数里做一些操作。Flask利用装饰器提供了以下四种钩子:
before_first_request:在处理第一个请求时执行,如链接数据库操作;
before_request:在每次请求前执行,如权限校验;
after_request:每次请求后调用,前提是没有未处理的异常抛出;
teardown_request:即使有未处理的异常抛出也在每次请求后调用。
需要注意before_first_request已被弃用,在Flask的以后版本会被删除,因此最好使用初始设置函数来替代。
如在运行程序之前需要创建数据库表,添加管理员用户,这些工作就可以由before_first_request来处理;再如网站需要记录用户最后在线的时间,就可以通过用户最后发送的请求时间来实现。为了避免在每个视图函数都添加最后在线的时间,可以仅在before_request来实现这段函数;再比如在视图函数中进行数据库操作时,需要将修改之后的数据提交到数据库中,就可以通过after_request来实现。
例:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
print('视图函数执行')
return 'index page'
# 在第一次请求之前运行.
@app.before_first_request
def before_first_request():
print('before_first_request')
# 在每一次请求前都会执行
@app.before_request
def before_request():
print('before_request')
# 在请求之后运行
@app.after_request
def after_request(response):
# response: 就是前面的请求处理完毕之后, 返回的响应数据,前提是视图函数没有出现异常
# response.headers["Content-Type"] = "application/json"
print('after_request')
return response
# 无论视图函数是否出现异常,每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息
@app.teardown_request
def teardown_request(error):
print('teardown_request: error %s' % error)
if __name__ == '__main__':
app.run(debug=True)运行代码后两次访问127.0.0.1:5000后结果如下:
A:\flaskDemo\venv\Scripts\python.exe A:\flaskDemo\07\04\run.py
\* Serving Flask app 'run'
\* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
\* Running on http://127.0.0.1:5000
Press CTRL+C to quit
\* Restarting with stat
\* Debugger is active!
\* Debugger PIN: 897-591-349
before_first_request
before_request
视图函数执行
after_request
teardown_request: error None
127.0.0.1 - - [26/May/2023 22:43:36] "GET / HTTP/1.1" 200 -
before_request
after_request
teardown_request: error None
127.0.0.1 - - [26/May/2023 22:43:36] "GET /favicon.ico HTTP/1.1" 404 -
127.0.0.1 - - [26/May/2023 22:44:10] "GET / HTTP/1.1" 200 -
before_request
视图函数执行
after_request
teardown_request: error None