我正在尝试将Tornado与SqlAlchemy一起使用,我需要在插入或更新操作中将当前用户从RequestHandler(tornado)传递给模型(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在update事件之前获取值。
想法是知道用户是创建者和更新者。 为什么我不希望将当前用户直接传递给模型,如前面的示例?,因为这将是其他开发人员的工具,我正在努力为他们做好准备,他们也可以忘记它,它是重要的。
这是个好主意,还是有其他更好的方法?
答案 0 :(得分:0)
如果您一次处理多个请求,则您的解决方案会出现问题。 Tornado是一个异步Web框架,因此另一个请求可能会覆盖您的全局变量并将用户设置为其他人。根据{{1}}上的数据存储请求是一种很好的做法,龙卷风将确保数据被其他同时请求更改。
可能适合您的解决方案是在基本处理程序中添加工具或创建装饰器。如果您希望获得更好的选择,请在您的问题中包含更多信息。
答案 1 :(得分:0)
当前用户在每个处理程序(和模板)中都可用。您如何确定,验证和设置当前用户取决于您。
基本上只是子类tornado.web.RequestHandler
并覆盖新/自己的BaseHandler中的get_current_user
方法。
来自龙卷风文档的引用:
用户身份验证 当前经过身份验证的用户在每个请求处理程序中都可用作self.current_user,在每个模板中都可用作current_user。默认情况下,current_user为None。
要在应用程序中实现用户身份验证,您需要覆盖请求处理程序中的get_current_user()方法,以根据(例如)cookie的值确定当前用户。这是一个允许用户通过指定昵称登录应用程序的示例,然后将昵称保存在cookie中。
您可以在官方龙卷风blog demo
中看到一个完整的例子