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

问题描述 投票:9回答:2

我是Flask和python的新手。我有一堆视图以jsonify()格式返回字典。对于这些视图中的每一个,我想添加一个after_request处理程序来改变响应,这样我就可以为该字典添加一个键。我有:

@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 indices必须是整数,而不是str”。如何在请求完成后更改响应字典并添加密钥?

python flask
2个回答
20
投票

response是一个WSGI对象,这意味着响应的主体必须是可迭代的。对于jsonify()响应,它只是一个只有一个字符串的列表。

但是,你应该在这里使用response.get_data() method来检索响应体,因为它会为你提供可迭代的响应。

以下应该有效:

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

不要再在这里使用jsonify();返回一个全新的响应对象;你想要的就是这里的JSON响应体。

请使用response.set_data(),因为它还会调整Content-Length标头以反映更改后的响应大小。


1
投票

这看起来有点旧,因为四年前写的最后一个回复。

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

response.get_json()

响应返回一个dict对象,但是如果您尝试更新非dict类型的键,Flask会返回错误。使用方法如下:

data = response.get_json()

if type(data) is dict:

    data['hi'] = 'hi'

    response.data = json.dumps(data)


return response
© www.soinside.com 2019 - 2024. All rights reserved.