Bottle 服务器:HTTPResponse 与 bottle.response

Bottle server: HTTPResponse vs bottle.response

我有一个 bottle 实例,其服务器设置为带有线程池的 multi-threaded http 服务器。

我们知道瓶服务器从路由 return 的一种常见方法是

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

我也在使用 after_request 钩子,它试图通过参考 bottle.response 在响应中设置一些 headers,我发现在 after_request钩子代码,它不能再访问相同的 HTTPResponse object,因为 bottle.response 引用的任何内容都是新响应 object。由 HTTPResponse 编辑的 return 的 object 丢失了。

我的理论是,这是因为 bottle.response 引用了 LocalResponse(),因此是 thread-local。

假设我无法修改我的 after_request 钩子代码,我该怎么做才能让我的 after_request 钩子仍然可以访问相同的 HTTPResponse object?

我可以想到两种方法:

1) 我没有 return 创建新的 HTTPResponse,而是 return 字典作为 body:

return json.dumps({'key','value'})

但是我现在如何 return 一个非 200 的状态码?

2) 不要 return 创建一个新的 HTTPResponse,而是:

bottle.response.status = 200; bottle.response.body = json.dumps({'key':'value'}); return bottle.response

是2)thread-safe?它会导致多个请求访问服务器并在 after_request 挂钩中混淆 returned 响应吗?

是的,使用 bottle.response 是线程安全的,即使在挂钩中也是如此。

注意:就个人而言,我更喜欢使用 Bottle 的插件而不是钩子 - 你的插件可以接收返回的 HTTPResponse 对象并直接对其进行操作,IMO 比依赖线程本地更干净 "magic."