美文网首页FastAPI
【OK】flask笔记(十六):请求钩子

【OK】flask笔记(十六):请求钩子

作者: warmsirius | 来源:发表于2019-09-25 08:05 被阅读0次

    一、什么是请求钩子?

    1.请求钩子的含义

    有时在处理请求之前或之后执行代码会很有用,在Django中学的中间件类似。

    例如,在请求开始时,我们可能需要创建数据库连接或认证发起请求的用户。

    为了避免在每个视图函数中都使用重复的代码,Flask提供了注册通用函数功能,注册的函数可在请求被分发到视图函数之前或之后调用。

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

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

    注意: 只是在debug=False的时候才会出现,如果为True,不会走这个方法。

    @app.teardown_request
    

    2. 请求钩子和视图函数共享数据

    请求钩子和视图函数之间共享数据一般使用 上下文全局变量:g

    例如,before_request处理程序可以从数据库中加载已登录用户,并将其保存到g.user中。随后调用视图函数时,视图函数再使用g.user获取用户。

    二、请求钩子举例

    可以通过request来获取请求,来区分请求钩子的执行,这种使用钩子的情况比较少,但是比较麻烦

    @app.before_request
    def handle_before_request():
        '''在第一次请求处理之前先被执行'''
        path = request.path
        if path == url_for("index"):
            print("在请求钩子中判断请求的视图逻辑")
        elif path == url_for('hello'):
            print('在hello中判断请求的逻辑')
        print("handle_before_reques被执行")
    
    @app.before_request
    def handle_before_request():
        '''在第一次请求处理之前先被执行'''
        path = request.path
        if path in [url_for("index"), url_for("hello")]:
            print("在请求钩子中判断请求的视图逻辑")
        elif path == url_for('hello'):
            print('在hello中判断请求的逻辑')
        print("handle_before_reques被执行")
    

    相关文章

      网友评论

        本文标题:【OK】flask笔记(十六):请求钩子

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