Специфические данные потока с помощью webpy

Я пишу небольшое веб-приложение с webpy, и мне интересно, есть ли у кого-нибудь информация о небольшой проблеме, с которой я столкнулся.

Я написал небольшую систему ORM, и, похоже, она работает довольно хорошо. В идеале я хотел бы сшить его с помощью webpy, но кажется, что простое использование его как есть вызывает проблемы с потоком (соединение с БД создается/доступно через границы потока или, таким образом, состояния исключения).

Кто-нибудь знает, как я могу (внутри webpy) создать соединение с БД в том же потоке, что и остальная часть кода обработки страницы?


person Eddie Parker    schedule 19.01.2009    source источник
comment
Вы используете встроенный веб-сервер webpy?   -  person Luca Matteis    schedule 20.01.2009
comment
Да, я/был. Я также использовал его в качестве модуля apache, но мне надоело перезапускать сервер (он не всегда работал при перезагрузке при подключении к apache. :()).   -  person Eddie Parker    schedule 20.01.2009


Ответы (2)


Мы используем SQLAlchemy с web.py и используем хуки для создания и закрытия соединений с базой данных по запросу. SQLAlchemy обрабатывает пулы, поэтому не каждое соединение является TCP-соединением.

Локальное хранилище потока, которое вы хотите использовать, это web.ctx, т.е. каждый раз, когда вы обращаетесь к web.ctx, вы видите только свойства, установленные этим потоком.

Наш код выглядит примерно так:

def sa_load_hook():
    web.ctx.sadb = Session()

def sa_unload_hook():
    web.ctx.sadb.close()

web.loadhooks['sasession'] = sa_load_hook
web.unloadhooks['sasession'] = sa_unload_hook

Замените Session вашей функцией подключения к базе данных, и она должна работать нормально для вас.

person user62679    schedule 06.02.2009

Я попробую. Отказ от ответственности: у меня нет опыта работы с фреймворком web.py.

Я предлагаю вам попробовать следующее:

(1) Создайте глобальный экземпляр threading.local для отслеживания локальных объектов вашего потока (в вашем случае он будет отслеживать только один объект, сеанс базы данных).

import threading
serving = threading.local()

(2) В начале каждого запроса создайте соединение/сеанс базы данных и сохраните его в экземпляре threading.local. Если я правильно понимаю документацию web.py, вы можете сделать следующее:

def setup_dbconnection(handler): 
    serving.dbconnection = create_dbconnection(...)
    try:
        return handler()
    finally:
        serving.dbconnection.close() # or similar

app.add_processor(setup_dbconnection)

(3) В ваших методах контроллера (если они называются так в web.py?), всякий раз, когда вам нужно соединение с базой данных, используйте serve.dbconnection.

person codeape    schedule 20.01.2009