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."
我有一个 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."