2010-03-22 41 views
0

当我在.ini文件中设置debug = false时,我无法访问我的Pylons 0.9.7控制器中的request对象。我有以下代码:主机错误“没有对象(名称:请求)已注册此线程”debug = false

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)行。

我使用粘贴服务器运行它,这两行是我的控制器方法中的第一行。

只有在方法中有yield语句(即使未达到语句)时才会发生这种情况。我猜测Pylons认为这是一个生成器方法,并在其他线程上运行它。我的问题是:

  1. 如何使它与debug = false一起使用?
  2. 它为什么与debug = true一起使用?显然这是一个相当危险的错误,因为我通常使用debug = true进行开发,所以在开发过程中可以忽略它。
+0

也许调试= false是否在中间件.py中排除RegistryManager? – 2010-03-23 14:52:50

回答

2

你不应该直接从行动中产生。尝试使内部功能和返回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

好的,这有效。我通过分配'self.request = request._current_obj()'稍微修改它。但为什么我必须这样做,为什么只有debug = false? – EMP 2010-03-23 22:24:25

+0

因为'request'是StackedObjectProxy类型的模块级变量。它在所有线程之间共享,并对绑定到当前正在运行的线程的真实对象执行操作。手动获取_current_obj()的原因可能是Pylons设计。我认为当操作完成后,它会从当前线程'解除绑定'请求。当塔架产生'func'功能的结果时,动作已经完成。 不知道调试= false设置,但我想这是由于一些中间件,改变请求行为。 – Yaroslav 2010-03-24 09:57:18

+0

您需要设置debug = false,因为在其他情况下,输出会被缓冲,并且不会产生“流式传输”效果。 – Yaroslav 2010-03-24 10:08:42

0

当您设置的中间件,能够在RegistryManager流支持:

app = RegistryManager(app, streaming=True) 

这使注册表(aoo_globals等)的生命,直到你的回应已完成迭代。

相关问题