SQLAlchemy + Tornado:如何为SQLAlchemy的ScopedSession创建scopefunc?


问题内容

使用龙卷风,我想创建一些中间件魔术,以确保正确关闭/清理我的SQLAlchemy会话,从而不会在一个请求到下一个请求之间共享对象。诀窍在于,由于我的某些龙卷风处理程序是异步的,因此我不能仅为每个请求共享一个会话。

因此,我离开尝试创建一个ScopedSession,它知道如何为每个请求创建一个新会话。我需要做的就是为我的代码定义一个scopefunc,它可以将当前正在执行的请求转换为某种唯一键,但是我似乎无法弄清楚如何在任何时间点
获取 当前请求(外部当前RequestHandler的范围之内,而我的函数对此无权访问)。

我可以做些什么来使这项工作吗?


问题答案:

您可能希望将Session与请求本身关联(即,如果不方便,请不要使用scopedsession)。然后,您可以说request.session。仍然需要在开始/结束时具有挂钩以进行设置/拆卸。

编辑:自定义范围功能

def get_current_tornado_request():
   # TODO: ask on the Tornado mailing list how
   # to acquire the request currently being invoked

Session = scoped_session(sessionmaker(), scopefunc=get_current_tornado_request)