我想知道在猎鹰中创建一个范围会话的最佳位置。
通过阅读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()
这会对猎鹰有用吗? get_ident
func"做正确的事情"什么时候使用gunicorn?
答案 0 :(得分:18)
您可以使用middleware
实施例
创建engine,session_factory和scoped_session对象。
@app.route('/<ds>', methods=['GET', 'POST'])
def treeview(ds):
distMeasure = request.args.get('dist')
correction = request.args.get('corr')
big_json_tree = tree2json(distMeasure, correction, cutStrategy, minSize, maxSize, ..)
if request.args.get('node_id'):
id = request.args.get('node_id')
select_data = select(big_json_tree,id)
render_template("nodeview.html", data=select_data)
else:
render_template("baseview.html", data=big_json_tree)
创建中间件。
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),
])
答案 1 :(得分:1)
在pypi上有一个软件包falcon-sqla,它提供了一个中间件来管理与Falcon的SQLAlchemy会话。
它使用请求上下文对象向每个http请求添加一个不同的会话,从而避免了使用作用域会话。