如何在after_request函数中更改Flask中的响应?

2024-06-02 05:06:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我对烧瓶和Python还不熟悉。我有很多视图返回jsonify()格式的字典。对于这些视图中的每一个,我想添加一个after_请求处理程序来更改响应,这样我就可以向字典中添加一个键。我有:

@app.route('/view1/')
def view1():
  ..
  return jsonify({'message':'You got served!'})

@app.after_request
def after(response):
  d = json.loads(response.response)
  d['altered'] = 'this has been altered...GOOD!'
  response.response = jsonify(d)
  return response

我得到的错误是“TypeError:list索引必须是整数,而不是str”。如何更改响应字典并在请求完成后添加密钥?


Tags: 视图app处理程序messagereturn字典烧瓶response
2条回答

这看起来有点老,因为最后一封回信是四年前写的。

似乎有一种方法可以在不解析响应数据字符串的情况下获取响应。使用

response.get_json()

响应返回dict对象,但如果尝试更新非dict类型的密钥,则as Flask返回错误。使用如下:

data = response.get_json()

if type(data) is dict:

    data['hi'] = 'hi'

    response.data = json.dumps(data)


return response

response是一个WSGI对象,这意味着响应的主体必须是一个iterable。对于只包含一个字符串的列表的jsonify()响应。

但是,您应该使用这里的^{} method来检索响应体,因为这将使您可以获得的响应变平。

以下方法应该有效:

d = json.loads(response.get_data())
d['altered'] = 'this has been altered...GOOD!'
response.set_data(json.dumps(d))

不要在这里再次使用jsonify();它返回一个全新的响应对象;您只需要这里的JSON响应体。

Do使用^{},因为这还将调整Content-Length头以反映更改的响应大小。

相关问题 更多 >