【发布时间】:2017-12-13 15:13:50
【问题描述】:
我正在为 Tornado 中的用户会话管理实施一个安全的 cookie 方案。通过 SQLAlchemy 访问用户的详细信息。目前我需要打开两个数据库会话:一个用于验证用户在身份验证期间是否存在,另一个用于查询模型的其他部分。像这样的:
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
user_id = self.get_secure_cookie('user')
if not user_id:
return None
with model.session_scope() as session:
user = session.query(model.AppUser).get(user_id)
if not user:
return None
session.expunge(user)
return user
class OtherHandler(BaseHandler):
@tornado.web.authenticated
@gen.coroutine
def put(self, ob_id):
with model.session_scope() as session:
other = session.query(model.Other).get(ob_id)
session.merge(self.current_user)
if not user.can_view(other):
raise AuthzError
yield self.some_operation(other)
self.finish()
如果我不必使用merge 将用户对象带回会话中,那就太好了。是否有一种安全的方法可以将数据库会话和persistentuser 对象存储在处理程序中?我正在考虑做这样的事情:
class BaseHandler(tornado.web.RequestHandler):
def prepare(self):
self.session = model.Session()
user_id = self.get_secure_cookie('user')
if user_id:
self.current_user = session.query(model.AppUser).get(user_id)
def finish(self, chunk=None):
try:
return super().finish(chunk)
finally:
self.session.commit()
def send_error(self, status_code=500, **kwargs):
try:
return super().send_error(status_code=status_code, **kwargs)
finally:
self.session.rollback()
问题:
- 即使使用异步代码(
@gen.coroutine和yield),将session(或其他任何内容)存储在self中是否安全? - 我在
finish和send_error中关闭会话的方式是否稳健?我想确保我没有任何僵尸会话。
【问题讨论】:
-
与您的问题无关,但是,我认为使用 Tornado 中的 SQLAlchemy 查询 db 会阻塞服务器。
标签: python session asynchronous sqlalchemy tornado