瓶路线中的全局变量丢失

时间:2014-06-10 15:44:18

标签: python scope bottle

我使用Bottle作为Python Web框架。

基本上,这就是我正在做的事情:

auth.py

from bottle import get

logger = None
webserver = None

def load(server):
    global logger, webserver

    logger = server.getLogger('auth')
    webserver = server

@get('/auth')
def auth():
    logger.debug('Entering route')

webserver.py

import bottle
import imp

class WebServer(object):
    # ...

    def getLogger(self, name):
        # ...

    def start_wsgi(self):
        # ...

        app = bottle.default_app()

        mod = imp.load_source('auth', 'auth.py')
        mod.load(self)

        # ...

        return app

    # ...

ws = WebServer()
app = ws.start_wsgi()

注意:此处没有错误处理或额外代码,我刚刚暴露了该问题的有趣内容(在我看来)

似乎全局范围不在主进程(运行WebServer代码)和处理请求的线程之间共享(logger仍然是None当我点击/auth网址)。

在功能id(logger)中打印load()并添加路由auth()(添加了global logger,以确定无效),我得到两个不同的ID。

如何将记录器共享给处理请求的线程?

PS:我尝试在默认的Bottle应用中添加一个字段,如下所示:

app = default_app()
app.logger = # mylogger

然后在路线中:

app = default_app()
app.logger.debug('Message')

但似乎即使default_app()也不同。

1 个答案:

答案 0 :(得分:1)

  

如何将记录器共享给处理请求的线程?

     

...

     

通过在函数load()中打印id(logger)并路由auth()(添加了全局记录器,只是为了确定),我得到两个不同的ID。

没关系 - 您的记录器变量不需要引用相同的记录器对象,以便在线程之间正常工作。

每个线程都应该只获取其记录器:

logger = logging.getLogger('foo.bar.baz')

那会很好用。 (通过线程,请注意,not across processes。)

顺便说一下,我不确定你的Webserver.getLogger函数返回什么,但无论如何这个函数似乎没必要。

P.S。,好奇 - 您实际上是否看到了日志记录输出的问题,或者当您发现不同记录器变量的id不相同时,您是否感到惊讶?