Каков рекомендуемый шаблон использования scoped_session в многопоточном веб-приложении sqlalchemy?

Я пишу приложение с python и sqlalchemy-0.7. Он начинается с инициализации orm sqlalchemy (с использованием декларативного), а затем запускает многопоточный веб-сервер - в настоящее время я использую web.py для быстрого прототипирования, но это может измениться в будущем. Я также добавлю другие «потоки» для запланированных заданий и так далее, возможно, используя другие потоки Python.

Из документации SA я понимаю, что должен использовать scoped_session () для получения сеанса локального потока, поэтому мое приложение web.py должен выглядеть примерно так:

import web
from myapp.model import Session  # scoped_session(sessionmaker(bind=engine))
from myapp.model import This, That, AndSoOn
urls = blah...
app  = web.application(urls, globals())

class index:
    def GET(self):
        s = Session()
        # get stuff done
        Session().remove()
        return(stuff)

class foo:
    def GET(self):
        s = Session()
        # get stuff done
        Session().remove()
        return(stuff)

Это правильный способ обработки сеанса?

Насколько я понимаю, я должен получать scoped_session для каждого метода, поскольку он ' предоставлю мне локальный сеанс потока, который я не мог получить заранее (например, на уровне модуля).

Кроме того, я должен вызывать .remove () или .commit () или что-то вроде них на каждом конец метода, иначе сеанс по-прежнему будет содержать Постоянные объекты, и я не смогу запрашивать / получать доступ к тем же объектам в других потоках?

Если этот шаблон правильный, его, вероятно, можно было бы создать лучше всего один раз написать, может быть, с помощью декоратора? Такой декоратор может получить сеанс, вызвать метод, а затем убедиться, что он правильно удалил сеанс. Как это передать сеанс декорированной функции?

27
задан Luke404 4 April 2011 в 21:51
поделиться