我是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”。如何在请求完成后更改响应字典并添加密钥?
答案 0 :(得分: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 :(得分: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