使用例如process_response在Flask中修改响应的正确方法

时间:2011-11-12 15:40:59

标签: python flask

给定一个简单的Flask应用程序,我只是想知道是否有一种正确的方法来修改process_response等钩子中的响应?

e.g。给出:

from flask import Flask, Response

class MyFlask(Flask):
    def process_response(self, response):
        # edit response data, eg. add "... MORE!", but
        # keep eg mimetype, status_code
        response.data += "... This is added" # but should I modify `data`?
        return response
        # or should I:
        #     return Response(response.data + "... this is also added",
        #                     mimetype=response.mimetype, etc)

app = MyFlask(__name__)

@app.route('/')
def root():
    return "abddef"

if __name__ == '__main__':
    app.run()

每次只创建一个新的响应是否合适,或者仅仅编辑响应参数并返回修改后的响应是否正常?

这可能是纯粹的风格,但我很好奇 - 我没有注意到我的阅读中的任何内容都表明了这样做的首选方式(即使它可能很常见)。

感谢阅读。

2 个答案:

答案 0 :(得分:7)

来自Flask.process_response文档:

可以重写,以便在将响应对象发送到WSGI服务器之前对其进行修改。

在烧瓶调度程序机制(Flask.full_dispatch_request)上创建响应对象。因此,如果您想以自己的方式创建响应对象,请覆盖Flask.make_reponse。仅当使用创建的响应对象参数进行所需的修改时才使用Flask.process_response。

答案 1 :(得分:0)

实际上,您可以使用 Flask.process_response 来拦截和修改响应:

from flask import Flask
import json
import ast

appVersion = 'v1.0.0'

class LocalFlask(Flask):
    def process_response(self, response):
        #Every response will be processed here first
        response.headers['App-Version'] = appVersion
        success = True if response.status_code in [ 200, 201, 204 ] else False
        message = 'Ok' if success else 'Error'
        dict_str = response.data.decode("UTF-8")
        dataDict = ast.literal_eval(dict_str)
    
        standard_response_data = {
            'success': success,
            'message': message,
            'result': dataDict
        }
        response.data = json.dumps(standard_response_data)

        super(LocalFlask, self).process_response(response)
        return response