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

18 投票
2 回答
21568 浏览
提问于 2025-04-17 21:27

我刚开始学习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 头部,以反映响应内容的大小变化。

撰写回答