Pylons error «Нет объекта (имя: запрос) для этой темы» с debug = false - PullRequest
0 голосов
/ 23 марта 2010

Я не могу получить доступ к объекту request в моем контроллере Pylons 0.9.7, когда я установил debug = false в файле .ini. У меня есть следующий код:

def run_something(self):
    print('!!! request = %r' % request)
    print('!!! request.params = %r' % request.params)
    yield 'Stuff'

При включенной отладке все работает нормально и печатает:

!!! request = <Request at 0x9571190 POST http://my_url>
!!! request.params = UnicodeMultiDict([... lots of stuff ...])

Если я установлю debug = false, я получу следующее:

!!! request = <paste.registry.StackedObjectProxy object at 0x4093790>
Error - <type 'exceptions.TypeError'>: No object (name: request) has been registered for this thread

Трассировка стека подтверждает, что ошибка находится в строке print('!!! request.params = %r' % request.params).

Я запускаю его с помощью сервера Paste, и эти две строки - самые первые строки в моем методе контроллера.

Это происходит только в том случае, если в методе есть операторы yield (хотя операторы не достигнуты). Я предполагаю, что Pylons видит, что это метод генератора, и запускает его в каком-то другом потоке. Мои вопросы:

  1. Как мне заставить его работать с debug = false?
  2. Почему он работает с debug = true? Очевидно, что это довольно опасная ошибка, поскольку я обычно разрабатываю с debug = true, поэтому она может остаться незамеченной во время разработки.

Ответы [ 2 ]

2 голосов
/ 23 марта 2010

Вы не должны поддаваться действию напрямую. Попробуйте создать внутреннюю функцию и вернуть func ():

def run_something(self):
    request = pylons.request._current_obj()
    def func():
        print('!!! request = %r' % request)
        print('!!! request.params = %r' % request.params)
        yield 'Stuff'
    return func()
0 голосов
/ 19 июня 2014

При настройке промежуточного программного обеспечения включите поддержку потоковой передачи в RegistryManager:

app = RegistryManager(app, streaming=True)

Это поддерживает реестр (aoo_globals и т. Д.) До тех пор, пока ваш ответ не завершит итерацию.

...