给定一个简单的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()
每次只创建一个新的响应是否合适,或者仅仅编辑响应参数并返回修改后的响应是否正常?
这可能是纯粹的风格,但我很好奇 - 我没有注意到我的阅读中的任何内容都表明了这样做的首选方式(即使它可能很常见)。
感谢阅读。
答案 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