ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Flask 学习-67.钩子函数before_request 和 before_first_request 的使用

2022-09-09 16:02:06  阅读:78  来源: 互联网

标签:__ Flask app request teardown def before


前言

学过pytest框架的肯定知道什么叫钩子(hook)函数, 钩子函数的作用是在程序运行的过程中插入一段代码做一些事情。

四个钩子

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

before_first_request 在对应用程序实例的第一个请求之前注册要运行的函数, 只会执行一次
before_request 在每次请求前执行,如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
after_request 如果没有抛出错误,在每次请求后执行接受一个参数:视图函数作出的响应,在此函数中可以对响应值在返回之前做最后一步修改处理,需要将参数中的响应在此参数中进行返回
teardown_request: 每一个请求之后绑定一个函数,即使遇到了异常。。接受一个参数:错误信息,如果有相关错误抛出

before_first_request

before_first_request 在第一次请求之前执行

@app.before_first_request
def first_request():
    print('first request: hello ------------------')

使用示例

from flask import Flask, request, g
app = Flask(__name__)


@app.before_first_request
def first_request():
    print('first request: hello ------------------')


@app.route('/login')
def login():
    user = request.args.get('username')
    return {'msg': 'ok', 'admin': user}


@app.route('/index')
def index():
    return {'msg': 'ok'}


if __name__ == '__main__':
    app.run()

before_first_request 在项目启动后,第一次请求之前仅执行一次

before_request 和 after_request

before_request 在每次请求前执行,如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
after_request 如果没有抛出错误,在每次请求后执行接受一个参数

before_request 可以用于拦截请求数据,比如打印一些日志

@app.before_request
def pre_request():
    app.logger.debug(f'path:{request.path}')
    app.logger.debug(f'args:{dict(request.args)}')
    app.logger.debug(f'headers:{request.headers}')
    app.logger.debug(f'cookies:{dict(request.cookies)}')
    app.logger.debug(f'json:{request.json}')

完整的示例

from flask import Flask, request, g, abort
app = Flask(__name__)


@app.before_request
def pre1_request():
    print('pre1_request')


@app.before_request
def pre2_request():
    print('pre2_request')


@app.after_request
def aft1_request(response):
    print('aft1_request')
    return response


@app.after_request
def aft2_request(response):
    print('aft2_request')
    return response


@app.teardown_request
def teardown(exc=None):
    print('teardown_request')


@app.route('/login')
def login():
    user = request.args.get('username')
    return {'msg': 'ok', 'admin': user}


@app.route('/index')
def index():
    return {'msg': 'ok'}


if __name__ == '__main__':
    app.run()

执行顺序是

pre1_request
pre2_request
aft2_request
aft1_request
teardown_request

before_request 先注册的先执行,after_request先注册的后执行。
after_request 被触发的前提是没有异常抛出; 或者异常被 errorhandler 接住并处理

比如abort(400)异常被errorhandler 接住并处理,那么after_request也会执行。

@app.route('/index')
def index():
    abort(400)

teardown_request

teardown_request 就和其余的三个不太一样了. 严格的来说 teardown_request 没有固定的执行位置.
因为他直接和请求上下文环境挂钩. 只有在请求上下文被 pop 出请求栈的时候才会触发 teardown_request, 所以即使之前有抛出错误的时候也会都会被执行, 执行完后返回 response.

@app.teardown_request
def teardown(exc=None):
    print('teardown_request')

总的来说, 这几个装饰器装饰的方法执行的先后为 before_request -> errorhandler -> after_request
teardown_request 在将当前请求 pop 出请求栈的时候执。

标签:__,Flask,app,request,teardown,def,before
来源: https://www.cnblogs.com/yoyoketang/p/16673124.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有