#python #pyramid #thread-local #webob
#python #пирамида #поток-локальный #webbob
Вопрос:
С помощью следующего примера кода:
from webob import Response
from paste.httpserver import serve
def test_iter():
from pyramid import threadlocal
yield 'current request: %s' % threadlocal.get_current_request()
def hello_world(request):
return Response(app_iter=test_iter())
if __name__ == '__main__':
from pyramid.config import Configurator
config = Configurator()
config.add_view(hello_world)
app = config.make_wsgi_app()
serve(app, host='0.0.0.0')
Я получаю текущий запрос: Нет. Итак, threadlocal
не работает внутри app_iter
? У меня есть реальный код, в котором мне нужно получить доступ к threadlocal
нескольким слоям вдали от представления, и было бы громоздко передавать request
переменную по кругу.
Ответ №1:
Согласно документам Pyramid, локальный стек потоков не должен извлекаться до тех пор, пока не будет использован app_iter (см. Шаги 16 и 18), Хотя я вижу то же поведение, что и вы, когда пытаюсь запустить ваш пример. Поскольку документация и поведение противоречат друг другу, одно из них неверно, я рекомендую сообщить об ошибке сотрудникам Pyramid.
Комментарии:
1. Ах, это на самом деле ожидаемое поведение.
Ответ №2:
Может быть, ошибка?
return Response(app_iter=test_iter())
или
return Response(app_iter=test_iter)
Комментарии:
1.
app_iter
ожидает итератор. Передача простоtest_iter
вызовет ошибкуTypeError: 'function' object is not iterable
.