请求钩子
在每个请求执行视图之前或者执行完成之后,需要做一些操作,为了避免每个视图都重写重复代码,Flask提供了四个通用函数完成一系列操作,即请求钩子。
请求钩子使用修饰器实现。Flask支持以下4种钩子:
- before_first_request:注册一个在处理第一个请求之前运行的函数。
- before_request:注册一个在处理请求之前运行的函数。
- after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行,接收一个响应对象为参数,需要返回一个响应对象
- teardown_request:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行,接收一个响应对象为参数,需要返回一个响应对象。
# coding=utf-8
# 导入Flask类
from flask import Flask, abort
import datetime
# Flask 接收一个参数__name__,
# 导入模块的目录, flask以这个目录为基础,寻找静态文件目录static和模板目录templates
app = Flask(__name__)
# 只有在第一次请求的时候执行
@app.before_first_request
def first_request():
print("before_first_request 执行")
# 每次请求之前执行
@app.before_request
def before_request_():
print('before_request执行')
# 每次执行完成后没有未处理的异常抛出才会执行
@app.after_request
def after_request(response):
print('after_request 执行')
return response
# 即使视图函数有未处理的异常抛出都执行
@app.teardown_request
def teardown_request_(response):
print('teardown_request 执行')
return response
@app.route('/')
def index():
print('index 执行')
return 'ok'
if __name__ == '__main__':
# Flask 应用程序实例的方法run启动web服务器
app.run(debug=True)
请求钩子执行顺序:
g对象
g对象是应用上下文的一种,每一个请求过来都会创建一个g对象。g对象就是一个作用于app应用的全局变量。每个请求进来g对象都先置为空。
在钩子函数与视图函数中变量的传递,可以用g对象做为全局变量去传递。
from flask import Flask, g
# 每次请求之前执行
@app.before_request
def before_request_():
g.s = 'g对象传过来的参数'
print('before_request执行')
@app.route('/')
def index():
print('index 执行')
# 在视图函数中通过g对象获取参数
print(g.get('s'))
return 'ok'