syn*_*nic 14 python sqlalchemy flask-sqlalchemy falconframework
我想知道创建一个用于猎鹰的范围会话的最佳位置.
从阅读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()
Run Code Online (Sandbox Code Playgroud)
这会对猎鹰有用吗?get_ident
使用gunicorn时,功能会"做正确的事"吗?
esh*_*lox 20
您可以使用中间件
例.
创建engine,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)
Run Code Online (Sandbox Code Playgroud)创建中间件.
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()
Run Code Online (Sandbox Code Playgroud)注册中间件.
import falcon
app = falcon.API(middleware=[
SQLAlchemySessionManager(Session),
])
Run Code Online (Sandbox Code Playgroud)每个请求都可以访问会话.
import falcon
class MyAPI:
def on_get(self, req, resp):
# You can access self.session here
# self.session.add(foo)
# self.session.commit()
Run Code Online (Sandbox Code Playgroud)