美文网首页
Flask请求钩子

Flask请求钩子

作者: 测试探索 | 来源:发表于2020-09-21 06:16 被阅读0次

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

    • before_first_request:在处理第一个请求前运行
      @app.before_first_request
    • before_request:在每次请求前运行
    • after_request(response):如果没有未处理的异常抛出,在每次请求后运行
    • teardown_request(response):在每次请求后运行,即使有未处理的异常

    无异常情况下,请求钩子的实现顺序

    from flask import Flask,session,current_app,g
    
    app = Flask(__name__)
    
    
    # flask默认把session保存到了cookie中
    @app.route("/index")
    def set_cookie():
        print("index 被执行")
        return "index page"
    
    @app.before_first_request
    def handle_before_first_request():
        """
        在第一次请求处理之前先被执行
        :return:
        """
        print("handle_before_first_request 被执行")
    
    @app.before_request
    def handle_before_request():
        """
        在每次请求前都被执行
        :return:
        """
        print("handle_before_request 被执行")
    
    
    @app.after_request
    def handle_after_request(response):
        """
        在每次请求(视图函数处理之后)都被执行,前提是视图函数没有出现异常
        :return:
        """
        print("handle_after_request 被执行")
        return response
    
    @app.teardown_request
    def handle_teardown_request(response):
        """
        在每次请求(视图函数处理之后)都被执行,无论视图函数是否出现异常,都被执行
        工作在非调试模式时,debug=False
        :return:
        """
        print("handle_teardown_request 被执行")
        return response
    
    
    if __name__ == '__main__':
        app.run()
    
    第一次执行结果
    image.png
    第一次执行结果
    第二次执行结果
    第二次执行结果

    异常情况下,请求钩子的实现顺序,在视图函数里加入了a=1/0

    from flask import Flask,session,current_app,g
    
    app = Flask(__name__)
    
    
    # flask默认把session保存到了cookie中
    @app.route("/index")
    def set_cookie():
        print("index 被执行")
        a = 1/0
        return "index page"
    
    @app.before_first_request
    def handle_before_first_request():
        """
        在第一次请求处理之前先被执行
        :return:
        """
        print("handle_before_first_request 被执行")
    
    @app.before_request
    def handle_before_request():
        """
        在每次请求前都被执行
        :return:
        """
        print("handle_before_request 被执行")
    
    
    @app.after_request
    def handle_after_request(response):
        """
        在每次请求(视图函数处理之后)都被执行,前提是视图函数没有出现异常
        :return:
        """
        print("handle_after_request 被执行")
        return response
    
    @app.teardown_request
    def handle_teardown_request(response):
        """
        在每次请求(视图函数处理之后)都被执行,无论视图函数是否出现异常,都被执行
        工作在非调试模式时,debug=False
        :return:
        """
        print("handle_teardown_request 被执行")
        return response
    
    
    
    if __name__ == '__main__':
        app.run()
    
    执行结果
    补充说明
    from flask import Flask,session,current_app,request,url_for
    
    app = Flask(__name__)
    
    @app.route("/index")
    def index():
        print("index 被执行")
        a = 1/0
        return "index page"
    
    @app.route("/hello")
    def hello():
        print("hello 被执行")
        return "hello page"
    
    @app.before_first_request
    def handle_before_first_request():
        """
        在第一次请求处理之前先被执行
        :return:
        """
        print("handle_before_first_request 被执行")
    
    @app.before_request
    def handle_before_request():
        """
        在每次请求前都被执行
        :return:
        """
        print("handle_before_request 被执行")
    
    
    @app.after_request
    def handle_after_request(response):
        """
        在每次请求(视图函数处理之后)都被执行,前提是视图函数没有出现异常
        :return:
        """
        print("handle_after_request 被执行")
        return response
    
    @app.teardown_request
    def handle_teardown_request(response):
        """
        在每次请求(视图函数处理之后)都被执行,无论视图函数是否出现异常,都被执行
        工作在非调试模式时,debug=False
        :return:
        """
        path = request.path
        if path == url_for("index"):
            print("在请求钩子中,判断请求的视图函数:index")
        elif path == url_for("hello"):
            print("在请求钩子中,判断请求的视图函数:hello")
        print("handle_teardown_request 被执行")
        return response
    
    
    
    if __name__ == '__main__':
        app.run()
    

    运行代码,填写路由,即可查看结果

    相关文章

      网友评论

          本文标题:Flask请求钩子

          本文链接:https://www.haomeiwen.com/subject/yqlmyktx.html