在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:
-
在请求开始时,建立数据库连接;
-
在请求开始时,根据需求进行权限校验;
-
在请求结束时,指定数据的交互格式。
为了让每个视图函数避免编写重复功能的码,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_processo
r钩子函数
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
钩子函数定义,并且自动转换给多有模板,该函数硬顶要返回字典。