在龙卷风中处理用户会话的标准方法

时间:2013-03-06 17:55:39

标签: python tornado

因此,为了避免“没有人最好的答案”问题,我将问,不是以最好的方式,而是在使用Tornado框架时处理会话的标准或最常用的方法。也就是说,如果我们不使用第三方认证(OAuth等),而是我们希望在浏览器中拥有我们自己的带有安全cookie的Users表,但是大多数会话信息存储在服务器上,那么最常见的做法是什么?我见过有些人使用Redis,有些人使用普通数据库(MySQL或Postgres或其他),有些人使用memcached。

我正在处理的应用程序一次不会有数百万用户,甚至可能有数千名用户。但是,最终需要获得一些中等复杂的授权方案。我正在寻找的是确保我们不会做一些与一般Tornado社区不同的“奇怪”的事情,因为认证和授权虽然是我们需要的,但不是在我们产品的核心并不是我们应该区分自己的地方。所以,我们正在寻找大多数人(使用龙卷风)在这方面所做的事情,因此我认为(理论上)这是一个客观真实答案的问题。

当然,理想的答案将指向示例代码。

4 个答案:

答案 0 :(得分:14)

以下是其他微框架处理会话的方式(例如CherryPy,Flask):

  1. 创建一个包含session_id的表格以及您希望在每个会话基础上跟踪的任何其他字段。有些框架允许您将这些信息存储在每个用户的文件中,或者只是将内容直接存储在内存中。如果您的应用程序足够小,您也可以考虑这些选项,但数据库应该更容易实现。
  2. 当收到请求时(我认为RequestHandler initialize()函数?)并且没有session_id cookie,请使用随机生成器设置安全会话ID。我对Tornado没有多少经验,但看起来设置安全cookie应该对此有用。将session_id和相关信息存储在会话表中。请注意,每个用户都会有一个会话,即使是那些未登录的会话。当用户登录时,您需要将登录状态(及其用户名/ user_id等)附加到会话中。
  3. RequestHandler初始化函数中,如果有session_id cookie,请从DB中读取您需要的会话信息,并可能创建自己的Session对象以填充并存储为该请求处理程序的成员变量
  4. 请记住,会话应该在一定程度的不活动后过期,因此您也需要检查它。如果你想要一个“记住我”类型的登录情况,你将不得不使用一个安全的cookie来发出信号(在OWASP上阅读这个以确保它尽可能安全,再次想到它看起来像Tornado的secure_cookie可能有帮助使用那个),并且在收到超时会话后,您可以通过创建新会话并从旧会话中传输任何相关信息来重新验证新用户。

答案 1 :(得分:11)

龙卷风旨在成为无国籍人,并且没有开箱即用的会话支持。

使用安全cookie存储user_id等敏感信息。 使用标准cookie存储非关键信息。

用于存储大型对象 - 使用标准方案 - MySQL + memcache。

答案 2 :(得分:3)

会话的关键问题不在于存储它们,而在于如何智能地使它们过期。无论会话存储在何处,只要存储的会话数量合理(即只存储活动会话加上一些剩余),所有这些数据都将适合RAM并快速提供。如果存在大量旧垃圾,您可能会遇到不可预测的延迟(需要点击磁盘来加载会话)。

答案 3 :(得分:2)

为此目的,龙卷风没有直接建造任何东西。正如其他人已经评论过的那样,Tornado被设计成一个非常快速的异步框架。它设计精益求精。但是,可以挂钩您自己的会话管理功能。您需要为每个创建或获取会话容器的处理程序添加一个前导部分。您需要将会话ID存储在cookie中。如果您不是严格的HTTPS,那么您将需要使用安全cookie。会话持久性可以是您选择的任何技术,如Redis,Postgres,MySQL,文件存储等......

有一个Github项目为Tornado提供会话管理。即使您决定不使用它,它也可以提供有关如何构建自己的会话管理的深入见解。 Github项目名为dustdevil。完全披露 - 我们几年前创建了这个,但发现它很容易使用,并且今天已经积极使用。