pyramid — threadlocal не работает внутри app_iter ответа

#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 .