SQLAlchemy and Falcon - session initialization
There is a package on pypi, falcon-sqla, that provides a middleware to manage SQLAlchemy sessions with Falcon.
It uses the request context object to add a different session to each http request, avoiding the need to use a scoped session.
You can use middleware
Example.
Create engine, session_factory and scoped_session object.
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)
Create middleware.
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()
Register middleware.
import falcon app = falcon.API(middleware=[ SQLAlchemySessionManager(Session), ])
Session is accessible in every request.
import falcon class MyAPI: def on_get(self, req, resp): # You can access self.session here # self.session.add(foo) # self.session.commit()