我有两个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。但他们正在反向开火。
如果重要的是,在我的实际代码中,这两个处理程序不会像这样连续声明。它们各自处于不同时间安装的不同模块中。
如何控制执行顺序?
答案 0 :(得分:3)
Flask的after_request
挂钩确实按照其声明的相反顺序执行。相反,before_request
挂钩按其声明顺序执行。
如果在蓝图上声明了after_request
挂钩,那么它们将以相反的声明顺序执行,即在全局after_request
挂钩之前 。如果在蓝图上声明了before_request
挂钩,那么它们将以声明顺序执行,在全局before_request
挂钩之后之后。
有关实现的详细信息,请参见preprocess_request和process_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)