2014-06-10 1 views
0

Я использую бутылку как веб-фреймворк 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() 

NB: нет обработки ошибок или Дополнительный код здесь, я просто рассказал, что интересно в этом вопросе (по-моему)

Похоже, что глобальный масштаб не разделяются между основным процессом (который запускает WebServer кода) и для обработки запроса нити (logger еще None, когда я попал в /auth URL).

Печатая id(logger) в функции load() и маршрут auth() (с добавил global logger, просто чтобы быть уверенным), я получаю две разные идентификаторы.

Как я могу поделиться своими регистраторами с потоками, обрабатывающими запрос?

PS: Я попытался добавить поле для применения в бутылки по умолчанию, например:

app = default_app() 
app.logger = # mylogger 

, а затем в маршруте:

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

Но мне кажется, что даже default_app() является другой.

ответ

1

Как я могу поделиться своими регистраторами с потоками, обрабатывающими запрос?

...

Печатая идентификатор (регистратор) в функции нагрузки() и маршрут (авт) (с глобальным регистраторе добавил, просто чтобы быть уверенным), я получаю две разные идентификаторы.

Это нормально - переменные вашего регистратора не должны ссылаться на один и тот же объект логарифма, чтобы все работало правильно по потокам.

Каждый поток должен просто приобрести его регистратор:

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

Это будет работать нормально. (Across нитей, заметьте, not across processes.)

BTW, я не уверен, что ваши Webserver.getLogger функция возвращает, но в любом случае эта функция кажется ненужным.

P.S., Просто любопытно. Вы действительно видите проблему с выходом в журнал, или вы были просто удивлены, когда заметили, что переменные регистратора не совпадают?

+0

Функция '' Webserver.getLogger'' инициализирует регистратор для того же уровня ведения журнала, который используется в классе '' Webserver''. И мне все еще нужна глобальная ссылка на '' webserver'' (такая же проблема, как '' logger'') – linkdd

+0

Тогда, боюсь, я не совсем понимаю, что вы спрашиваете. Что мешает вам ссылаться на «веб-сервер»? –

+0

В этом вопросе, на маршруте ''/auth'', '' webserver'' и '' logger'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' веб сервер. – linkdd