我有一个瓶子服务器(其基础的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却没有?
答案 0 :(得分:0)
尝试在要返回的新对象中设置标头,如下所示:
return HTTPResponse(status=200, body=json.dumps({'body': 'my body'}, headers={'Access-Control-Allow-Origin': '*'})
我的猜测是after_request
钩子在Bottle为您管理的“魔术”响应对象上运行-因此,当您创建并返回一个 new 时,其标头不是修改。