【问题标题】:How do I alter a response in flask in the after_request function?如何在 after_request 函数中更改烧瓶中的响应?
【发布时间】:2014-03-08 19:41:57
【问题描述】:

我是 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”。请求完成后如何更改响应字典并添加键?

【问题讨论】:

    标签: python flask


    【解决方案1】:

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

    但是,您应该在此处使用 response.data property 来检索响应正文,因为这会使您的可迭代响应变平。

    从 Flask 1.0 开始,您甚至不必从 JSON 中解码数据,您可以改用新的 Response.get_json() method

    以下应该有效:

    d = response.get_json()
    d['altered'] = 'this has been altered...GOOD!'
    response.data = json.dumps(d)
    

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

    您可以改为分配回response.data,这将负责编码回字节并调整Content-Length 标头以反映更改后的响应大小。

    【讨论】:

    • 如以下答案所述,可以使用get_json() (docs) 作为json.loads(response.get_data()) 的快捷方式。同样在 Flask 1.1.x 中,我无法使用 set_data(some_json_data) 函数来更改响应对象的数据。相反,如下例所示,将response.data 设置为 json 直接有效!
    • @cody.codes: response.get_json() 已添加到 Flask 1.0 中,在编写此答案后发布。设置response.data 调用response.set_data(...),所以如果一个有效而另一个无效,那么你做了其他不同的事情。
    【解决方案2】:

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

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

    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
    

    【讨论】:

    • 你还应该使用set_data() 不?
    • 至少在 Flask 1.1.x 中,response.data 是一个调用 get_data()set_data() 的描述符,在这种情况下,这使得 response.data 属性与调用函数 @987654329 相同@Source:Flask docs on Response object(在这个版本的 Flask 中我实际上无法访问 response.set_data(some_json_data),因此有此评论)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2017-12-04
    • 2021-12-22
    • 1970-01-01
    • 2015-12-02
    • 2017-11-01
    相关资源
    最近更新 更多