

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:
-
在请求开始时,建立数据库连接;
-
在请求开始时,根据需求进行权限校验;
-
在请求结束时,指定数据的交互格式。
为了让每个视图函数避免编写重复功能的码,Flask提供了通用设施的功能,即请求钩子。
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
before_first_request:在处理第一个请求前执行
before_request:在每次请求前执行
- 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
after_request:如果没有抛出错误,在每次请求后执行
-
接受一个参数:视图函数作出的响应
-
在此函数中可以对响应值在返回之前做最后一步修改处理
-
需要将参数中的响应在此参数中进行返回
teardown_request:在每次请求后执行
- 接受一个参数:错误信息,如果有相关错误抛出
from flask import Flask, make_response, request
app = Flask(__name__, static_url_path='/static', static_folder='static')
@app.before_first_request
def before_first_request():
print('服务器每一次接受请求的时候执行')
@app.before_request
def before_request():
print('每次视图函数执行之前执行')
# 如果有return,后面的函数就不执行了
# return "提前结束"
@app.after_request
def after_request(response):
print('每次视图函数之后执行')
return response
@app.teardown_request
def teardown_request(response):
print('请求结束的时候执行')
@app.route('/')
def hello_world(): # put application's code here
return 'Hello World'
@app.route('/set')
def setRH():
response = make_response('Hello request hook')
return response
@app.route('/get')
def getRH():
return '请求钩子结束'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8888, debug=True)
启动服务器

处理第一个请求前执行before_first_request


处理get、set请求后



可以看出第一次请求后before_first_request未执行。
还有一些:比如errorhandler和context_processor钩子函数
errorhandler钩子函数
500.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>服务器出错了</title>
</head>
<body>
<h2 style="color: aqua">服务器出错了哦!</h2>
</body>
</html>
@app.route('/get')
def getRH():
'abc' + 100
return '请求钩子结束'
# 任何一个视图函数出现错误时候直接调用
@app.errorhandler(500)
def server_error(error):
print(error)
return render_template('500.html'), 500

TypeError: can only concatenate str (not "int") to str
context_processo钩子函数
context_processo:当项目中所有模板都需要一个参数的时候,可以再context_processo钩子函数定义,并且自动转换给多有模板,该函数硬顶要返回字典。




![[附源码]Python计算机毕业设计后疫情时期社区居民管理系统Django(程序+LW)](https://img-blog.csdnimg.cn/c92b25eb9e524054acb708aeaff0411b.png)













![[ 数据结构 -- 手撕排序算法第四篇 ] 选择排序](https://img-blog.csdnimg.cn/53493c3c617f4152878ee3f340778dcd.png)
