在Bottle中返回HTTPResponse对象会丢失响应头

时间:2018-12-05 20:53:02

标签: python web cors bottle

我有一个瓶子服务器(其基础的http服务器已被多线程CherryPy换出),其中我的一条路由(“ POST”)直接返回HTTP响应,而不是json字典,例如: / p>

return HTTPResponse(status=200,body=json.dumps({'body':'my body'})

现在,我在我的瓶子应用中添加了'after_request'钩子,以便它将在响应中设置标头以处理CORS,例如,在我的after_request钩子中,我有:

bottle.response.set_header('Access-Control-Allow-Origin', '*')

我可以确认after_request函数已运行并成功在bottle.response上设置了标头。

但是,我的路由函数在after_request函数运行之前返回,因此我的浏览器在响应消息中仍然看不到这些标头。

但是,如果我只是修改route函数以返回一个简单的json dict,而不是HTTPResponse,例如:

return json.dumps({'body':'my body'}

然后突然,浏览器看到了我的after_request钩子设置的标题。即使我的其余代码保持不变。

有什么作用?为什么返回HTTPResponse会使我丢失所有标头,而仅返回一个简单的json却没有?

1 个答案:

答案 0 :(得分:0)

尝试在要返回的新对象中设置标头,如下所示:

return HTTPResponse(status=200, body=json.dumps({'body': 'my body'}, headers={'Access-Control-Allow-Origin': '*'})

我的猜测是after_request钩子在Bottle为您管理的“魔术”响应对象上运行-因此,当您创建并返回一个 new 时,其标头不是修改。