请求钩子

在每个请求执行视图之前或者执行完成之后,需要做一些操作,为了避免每个视图都重写重复代码,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'
Iyoyo电子书 一本集作者多年开发经验的python电子书 all right reserved,powered by Gitbook文件修订时间: 2022年 10:58:11