Bottle路由中全局变量消失

0 投票
1 回答
1659 浏览
提问于 2025-04-18 09:18

我正在使用Bottle作为Python的网页框架。

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

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代码的部分)和处理请求的线程之间并没有共享全局变量(当我访问/auth这个网址时,logger仍然是None)。

通过在load()函数和auth()路由中打印id(logger)(加上global logger,只是为了确认),我得到了两个不同的ID。

我该如何让我的日志记录器在处理请求的线程之间共享呢?

附注:我尝试在默认的Bottle应用中添加一个字段,像这样:

app = default_app()
app.logger = # mylogger

然后在路由中:

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

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

1 个回答

1

我该如何将我的日志记录器分享给处理请求的线程呢?

...

通过在函数load()和路由auth()中打印id(logger)(加上一个全局日志记录器,以确保准确),我得到了两个不同的id。

这没问题——你的日志记录器变量不需要引用同一个日志对象,线程之间也能正常工作。

每个线程只需要获取自己的日志记录器:

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

这样就可以正常工作了。(注意,这是在线程之间,而不是在进程之间,请注意这一点。)

顺便问一下,我不太确定你的Webserver.getLogger函数返回什么,但无论如何,这个函数似乎是多余的。

另外,我很好奇——你真的在日志输出中遇到了问题,还是只是因为看到不同日志变量的id不一样而感到惊讶?

撰写回答