zoukankan      html  css  js  c++  java
  • flask基础之请求钩子(十二)

    前言

    什么是请求钩子?在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子。

    请求钩子的原理

    先回顾一下flask对请求的处理流程:

    接收请求--》创建请求上下文--》请求上下文入栈--》创建该请求的应用上下文--》应用上下文入栈--》处理逻辑--》请求上下文出栈--》应用上下文出栈

    看了这个过程,flask放置请求钩子的位置有:处理逻辑之前,处理逻辑之后,应用上下文出栈之前。

    flask有五种常用请求钩子:

    • before_first_request:在处理app第一个请求前运行。

    • before_request:在每次请求前运行。

    • after_request:如果处理逻辑没有异常抛出,在每次请求后运行。

    • teardown_request:在每次请求后运行,即使处理发生了错误。

    • teardown_appcontext:在应用上下文从栈中弹出之前运行

    定义请求钩子

    # before_request装饰的方法会加载到app的before_request_funcs列表中,按加载的顺序依次执行,不需要参数
    @app.before_request
    def rest_test():
        print('this is a test'+ '--2')
        pass
    
    # before_first_request装饰的函数加载到before_first_request_funcs列表中,只不过在app第一次接收到请求后执行,其他时候不再执行
    @app.before_first_request
    def app_first_request():
        print('first_request' + '--1')
    
    # after_request装饰的函数加载到after_request_funcs列表中,传入的参数是response对象,可以对其进行拦截修改,必须返回一个response对象
    @app.after_request
    def after_request(rsp):
        print(rsp)
        print('--3')
        return rsp
    
    # teardown_request装饰的函数加载到teardown_request_funcs中,如果发生了异常则传入error的对象,无异常参数为None,无返回值
    @app.teardown_request
    def teardown_request(error):
        print(error)
        print('--4')
    
    # teardown_appcontext装饰的函数加载到teardown_appcontext_funcs中,如果发生了异常则传入error的对象,无异常参数为None,无返回值
    @app.teardown_appcontext
    def teardown_appcontext(error):
        print('--5')
    

    注意

    • 在debug模式下,teardown_request和teardown_appcontext装饰的函数不会执行;

    • after_request请求钩子会自动传入response对象作为参数,同时必须返回一个response对象;

    • before_request装饰的函数不需要返回数据,如果返回了数据,那么视图函数不会再执行,而是直接返回结果。

    蓝图的请求钩子

    蓝图存在的目的是为了在大型应用中对众多的业务模块的api分层次管理,所以即使在主app下定义的路由规则,其默认是在None为名字的蓝图下面的,所以蓝图也有自己的请求钩子,只在该蓝图下的api其作用。

    from flask import Blueprint
    
    testblue = Blueprint('blue', __name__)
    
    # 蓝图也可以为主app添加请求钩子,before_app_first_request装饰会在app的before_first_request_funcs列表中,以None为键;
    @testblue.before_app_first_request
    def app_first_request():
        print('first_request' + '--1')
    
    # 加载到app的before_request_funcs列表中,在None蓝图下,按加载的顺序依次执行,不需要参数
    @testblue.before_app_request
    def app_request():
        pass
    
    # 加载到app的before_request_funcs列表中,在testblue蓝图下
    @testblue.before_request
    def blue_before_request():
        pass
    
    # 加载到after_request_funcs列表中,在testblue蓝图下
    @testblue.after_request
    def after_request(rsp):
        return rsp
    
    # 加载到after_request_funcs列表中,在None蓝图下
    @testblue.after_app_request
    def blue_after_app_request(rsp):
        return rsp
    
    #teardown_request装饰的函数加载到app的teardown_request_funcs中,在testblue蓝图下
    @testblue.teardown_request
    def teardown_request(error):
        print(error)
        print('--4')
    
    # 和teardown_request功能一样,在None蓝图下
    @testblue.teardown_app_request
    def blue_teardown_app_request(error):
        pass
    

    注意

    • teardown_request装饰的函数无论有没有异常都执行,after_request装饰的函数无异常才执行。

    • 对于before_request、after_request、teardown_request请求钩子,如果app存在相应的请求钩子函数,则蓝图和app的请求钩子函数都会执行,先执行app的钩子函数,再执行蓝图的钩子函数。

    参考

  • 相关阅读:
    C++中无数据成员的类的对象占用内存大小
    malloc在函数内分配内存问题
    字符数组拷贝与strcpy函数
    Python,anaconda及pycharm安装过程笔记
    DFS-深度优先搜索与BFS-广度优先搜索
    90 k数和 II
    88 Lowest Common Ancestor of a Binary Tree
    AdaBoost笔记之代码
    79 最长公共子串
    78 最长公共前缀
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/10094912.html
Copyright © 2011-2022 走看看