У меня есть экземпляр бутылки, чей сервер настроен на многопоточный http-сервер с пулом потоков.
Мы знаем один из распространенных способов возврата бутылочного сервера с маршрута -
return HTTPResponse(status=200, body=json.dumps({'key':'value'})
Я также использую хук after_request
, который пытается установить некоторые заголовки в ответе, ссылаясь на bottle.response
, и я обнаружил, что внутри хук-кода after_request
он больше не может получить доступ к тому же HTTPResponse
объект, потому что все, на что ссылается bottle.response
, является новым объектом ответа.Объект, возвращенный HTTPResponse
, потерян.
И моя теория такова, что это потому, что bottle.response
ссылается на LocalResponse()
и поэтому является локальным для потока.
Если я не могу изменить свой код хука after_request, что я могу сделать, чтобы мой хук after_request мог по-прежнему получать доступ к тому же объекту HTTPResponse
?
Я могу придумать 2 способа:
1) Вместо того, чтобы возвращать новый HTTPResponse
, я просто возвращаю словарь в качестве тела:
return json.dumps({'key','value'})
Но как теперь я могу вернуть код состояния, отличный от 200??
2) Вместо того, чтобы возвращать новый HTTPResponse
, выполните:
bottle.response.status = 200;
bottle.response.body = json.dumps({'key':'value'});
return bottle.response
Является ли 2) поточно-ориентированным?Это вызовет проблемы для нескольких запросов, попадающих на сервер, и возвращенные ответы будут перепутаны в хуке after_request?