如何在flask的after_request函数中修改响应?
我刚开始学习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 must be integers, not str”(类型错误:列表索引必须是整数,而不是字符串)。我该怎么做才能在请求完成后修改响应字典并添加一个键呢?
2 个回答
3
这看起来有点过时,因为最后的回复是四年前写的。
似乎有一种方法可以在不解析响应数据字符串的情况下获取响应。使用
response.get_json()
这个响应会返回一个字典对象,但如果你试图在非字典类型上更新一个键,Flask会返回错误。可以这样使用:
data = response.get_json()
if type(data) is dict:
data['hi'] = 'hi'
response.data = json.dumps(data)
return response
38
response
是一个 WSGI 对象,这意味着响应的内容必须是一个可迭代的对象。对于 jsonify()
返回的内容来说,这通常只是一个包含一个字符串的列表。
不过,你应该使用 response.data
属性 来获取响应的内容,这样可以把响应的可迭代对象变成简单的内容。
从 Flask 1.0 开始,你甚至不需要手动把 JSON 数据解码了,可以直接使用新的 Response.get_json()
方法。
下面的代码应该可以正常工作:
d = response.get_json()
d['altered'] = 'this has been altered...GOOD!'
response.data = json.dumps(d)
不要 在这里再次使用 jsonify()
; 这会返回一个全新的响应对象,而你只需要 JSON 响应的内容。
你可以直接把内容赋值给 response.data
,这样会自动处理编码成字节,并调整 Content-Length
头部,以反映响应内容的大小变化。