SQLAlchemy 和 Falcon - 会话初始化
SQLAlchemy and Falcon - session initialization
我想知道在什么地方创建用于 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
会 "do the right thing" 吗?
您可以使用middleware
示例。
创建引擎,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,它提供了一个中间件来管理与 Falcon 的 SQLAlchemy 会话。
它使用请求上下文对象为每个 http 请求添加不同的会话,避免使用范围会话。
我想知道在什么地方创建用于 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
会 "do the right thing" 吗?
您可以使用middleware
示例。
创建引擎,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,它提供了一个中间件来管理与 Falcon 的 SQLAlchemy 会话。
它使用请求上下文对象为每个 http 请求添加不同的会话,避免使用范围会话。