SQLAlchemy and Falcon - session initialization

后端 未结 2 1309
醉梦人生
醉梦人生 2021-02-07 13:45

I\'m wondering where the best place would be to create a scoped session for use in falcon.

From reading the flask-sqlalchemy code, it, in a round about way, does somethi

相关标签:
2条回答
  • 2021-02-07 14:20

    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.

    0 讨论(0)
  • 2021-02-07 14:23

    You can use middleware

    Example.

    1. 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)
      
    2. 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()
      
    3. Register middleware.

      import falcon
      
      
      app = falcon.API(middleware=[
          SQLAlchemySessionManager(Session),
      ])
      
    4. 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()
      
    0 讨论(0)
提交回复
热议问题