SQLAlchemy и Falcon - инициализация сессии
Мне интересно, где лучше всего было бы создать сессию с определенными областями для использования в соколе.
После чтения кода колба-sqlalchemy, он, в общем-то, делает что-то вроде этого:
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
try:
from greenlet import get_current as get_ident
except ImportError:
try:
from thread import get_ident
except ImportError:
from _thread import get_ident
connection_uri = 'postgresql://postgres:@localhost:5432/db'
engine = create_engine(connection_uri)
session_factory = sessionmaker(bind=engine)
session_cls = scoped_session(session_factory, scopefunc=get_ident)
session = session_cls()
Будет ли это работать для сокола? Будет ли get_ident
func "делать правильные вещи" при использовании gunicorn?
1 ответ
Вы можете использовать промежуточное ПО
Пример.
Создайте движок, session_factory и объект scoped_session.
from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session from sqlalchemy.orm import sessionmaker import settings engine = create_engine( '{engine}://{username}:{password}@{host}:{port}/{db_name}'.format( **settings.POSTGRESQL ) ) session_factory = sessionmaker(bind=engine) Session = scoped_session(session_factory)
Создать промежуточное ПО.
class SQLAlchemySessionManager: """ Create a scoped session for every request and close it when the request ends. """ def __init__(self, Session): self.Session = Session def process_resource(self, req, resp, resource, params): resource.session = self.Session() def process_response(self, req, resp, resource, req_succeeded): if hasattr(resource, 'session'): Session.remove()
Зарегистрировать промежуточное ПО.
import falcon app = falcon.API(middleware=[ SQLAlchemySessionManager(Session), ])
Сессия доступна в каждом запросе.
import falcon class MyAPI: def on_get(self, req, resp): # You can access self.session here # self.session.add(foo) # self.session.commit()
На pypi есть пакет falcon-sqla, который предоставляет промежуточное ПО для управления сеансами SQLAlchemy с помощью Falcon.
Он использует объект контекста запроса для добавления разных сеансов к каждому HTTP-запросу, избегая необходимости использовать сеанс с заданной областью.