我正尝试在SqlAlchemy中使用Tornado,我需要在插入或更新操作中将当前用户从RequestHandler (tornado)传递给models (SqlAlchemy)。但我不想将值直接传递给模型,例如:
#### RequestHandler POST method...
user = Session.query(User).get(1)
user.name = "bla, bla, bla..."
user.updated_by = self.current_user # don't use...
session.commit()
我在一个__ init__.py文件中使用一个全局变量,并在RequestHandler中设置当前用户值,然后使用SqlAlchemy在更新前事件中获取该值。
这个想法是为了知道哪个用户是创建者和更新者。为什么我不想像前面的例子那样直接将当前用户传递给模型呢?因为这将是其他开发人员的工具,我正在努力让他们感到舒适,同时,他们可以忘记它,这很重要。
这是个好主意,或者有没有其他更好的方法?
发布于 2014-03-12 19:17:23
如果您同时处理多个请求,则您的解决方案将会出现问题。Tornado是一个异步web框架,因此另一个请求可能会覆盖您的全局var,并将用户设置为其他人。将请求存储在self
上是一个很好的做法,tornado将确保数据被其他同时请求更改。
一种可能对您有效的解决方案是将您的工具添加到基本处理程序中或创建一个装饰器。建议更多细节是很棘手的,如果您想获得更好的替代方案,请在您的问题中包含更多信息。
发布于 2016-10-05 18:40:29
当前用户在每个处理程序(和模板)中都可用。如何确定、验证和设置当前用户由您决定。
基本上,只需将tornado.web.RequestHandler
子类化,并在新的/自己的BaseHandler中覆盖get_current_user
方法。
这里引用了龙卷风文档中的话:
用户身份验证当前通过身份验证的用户在每个请求处理程序中都是self.current_user,在每个模板中都是current_user。默认情况下,current_user为None。
要在应用程序中实现用户身份验证,需要覆盖请求处理程序中的get_current_user()方法,以根据cookie的值确定当前用户。下面是一个示例,它允许用户通过指定昵称登录到应用程序,然后将昵称保存在cookie中。
您可以在官方tornado blog demo中看到一个完整的工作示例
https://stackoverflow.com/questions/22316522
复制