SQLAlchemy和Falcon会话初始化



我想知道在哪里创建一个在falcon中使用的作用域会话是最好的。

通过阅读flask-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()

这对猎鹰有用吗?当使用gunicorn时,get_ident函数会"做正确的事情"吗?

可以使用中间件

的例子。

  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)
    
  2. 创建中间件。

    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. 注册中间件。

    import falcon
    
    app = falcon.API(middleware=[
        SQLAlchemySessionManager(Session),
    ])
    
  4. 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 -sql的包,它提供了一个中间件来管理SQLAlchemy会话。

它使用请求上下文对象为每个http请求添加不同的会话,从而避免了使用作用域会话的需要。

相关内容

  • 没有找到相关文章

最新更新