一尘不染

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

flask

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


阅读 919

收藏
2020-04-06

共1个答案

一尘不染

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

但是,你应该使用此处的response.get_data()方法来检索响应主体,因为这将使你可以迭代的响应变得平坦。

以下应该工作:

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标题以反映更改后的响应大小。

2020-04-06