В моем приложении WSGI используется SQLAlchemy. Я хочу начать сеанс при запуске запроса, зафиксировать его, если он грязный, и обработка запроса завершена успешно, в противном случае выполните откат. Итак, мне нужно реализовать поведение Django's TransactionMiddleware
.Связующее приложение WSGI для обработки SQLAlchemy session
Итак, я полагаю, что я должен создать WSGI промежуточное программное обеспечение и сделать следующие вещи:
- Создать и добавить DB сессию
environ
на предварительной обработки. - Получите сеанс БД от
environ
и вызовитеcommit()
на пост-обработку, если ошибок не было. - Получите сеанс БД от
environ
и вызовитеrollback()
при последующей обработке, если произошли некоторые ошибки.
Шаг 1 Для меня очевидно:
class DbSessionMiddleware:
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['db_session'] = create_session()
return self.app(environ, start_response)
Шаг 2 и 3 - нет. Я нашел example пост-обработки задачи:
class Caseless:
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
for chunk in self.app(environ, start_response):
yield chunk.lower()
Он содержит комментарий:
Обратите внимание, что функция
__call__
является генератор Python, который является типичным для такого рода «пост-обработки» задачи ,
Не могли бы вы прояснить, как это работает и как я могу решить свою проблему аналогичным образом.
Спасибо, Борис.
Могу ли я безопасно использовать 'db.get_session()' inside' self.app'? Например, вот так: 'db.get_session(). Query (...)'? Или возникают проблемы с локальным хранилищем потоков? –