Бутылочный сервер: HTTPResponse vs bottle.response - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть экземпляр бутылки, чей сервер настроен на многопоточный 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?

1 Ответ

0 голосов
/ 10 декабря 2018

Да, использование bottle.response является поточно-ориентированным, даже в хуках.

ПРИМЕЧАНИЕ: Лично я предпочитаю использовать плагины Bottle вместо хуков - ваш плагин может получить возвращенный объект HTTPResponse и действовать наэто напрямую, что IMO чище, чем полагаться на локальную «магию» потока

...