如何控制执行after_request处理程序的顺序?

时间:2017-01-03 00:28:13

标签: python flask

我有两个after_request处理程序。就我而言,我需要一个人在下一个之前开火。

@app.after_request
    def after_request_check_something(response):
        # do something
        return response

@app.after_request
    def after_request_compress(response):
        # do something
        return response

在我的情况下,我想先压缩,然后check_something。但他们正在反向开火。

如果重要的是,在我的实际代码中,这两个处理程序不会像这样连续声明。它们各自处于不同时间安装的不同模块中。

如何控制执行顺序?

2 个答案:

答案 0 :(得分:3)

Flask的after_request挂钩确实按照其声明的相反顺序执行。相反,before_request挂钩按其声明顺序执行。

如果在蓝图上声明了after_request挂钩,那么它们将以相反的声明顺序执行,即在全局after_request挂钩之前 。如果在蓝图上声明了before_request挂钩,那么它们将以声明顺序执行,在全局before_request挂钩之后之后

有关实现的详细信息,请参见preprocess_requestprocess_response源代码。

答案 1 :(得分:1)

修改:user8808265的答案看起来比我的更正确。

the documentation开始,似乎无法执行这些after_request处理程序的执行。该实现将处理程序存储在字典中,该字典本质上是无序的。

我建议创建一个单独的处理程序,以正确的顺序调用它们,如:

def after_request_check_something(response):
    # do something
    return response


def after_request_compress(response):
    # do something
    return response

@app.after_request
def after_request_combined(response):
    response1 = after_request_compress(response)
    after_request_check_something(response1)