【问题标题】:Tornado - Python global variableTornado - Python 全局变量
【发布时间】:2014-03-11 04:32:24
【问题描述】:

我正在尝试将 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 的更新事件之前获取值。

这个想法是知道什么用户是创建者和更新者。 为什么我不想像之前的示例那样直接将当前用户传递给模型?,因为这将是其他开发人员的工具,我正在努力让他们感到舒适,而且,他们可以忘记它,它是很重要。

这是个好主意,还是有其他更好的方法?

【问题讨论】:

    标签: python python-3.x global tornado


    【解决方案1】:

    如果您一次处理多个请求,您的解决方案就会出现问题。 Tornado 是一个异步 Web 框架,因此另一个请求可能会覆盖您的全局变量并将用户设置为其他人。将请求数据存储在self 上是一种很好的做法,tornado 将确保数据被其他同时请求更改。

    一个可能适合您的解决方案是将您的工具添加到基本处理程序中或创建一个装饰器。建议更多细节很棘手,如果您想获得更好的替代方案,请在您的问题中包含更多信息。

    【讨论】:

      【解决方案2】:

      当前用户在每个处理程序(和模板)中都可用。如何确定、验证和设置当前用户取决于您。

      基本上只是继承 tornado.web.RequestHandler 并在您的新/自己的 BaseHandler 中覆盖 get_current_user 方法。

      这是来自 tornado 文档的引述:

      tornado User authentication

      用户认证 当前经过身份验证的用户在每个请求处理程序中作为 self.current_user 可用,在每个模板中作为 current_user 可用。默认情况下,current_user 为 None。

      要在您的应用程序中实现用户身份验证,您需要覆盖请求处理程序中的 get_current_user() 方法,以根据例如 cookie 的值来确定当前用户。这是一个示例,用户只需指定昵称即可登录应用程序,然后将昵称保存在 cookie 中。

      您可以在官方 tornado blog demo 中看到一个完整的工作示例

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-24
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多