在Django web应用中实现“最后一次在线”功能的最佳方法是什么?

7 投票
4 回答
1461 浏览
提问于 2025-04-15 23:52

我有一个正在运行的django/apache2 + memcached应用程序(在ubuntu上),我想跟踪在线的登录用户。

有什么好的方法可以做到这一点呢?

我希望每次登录用户加载页面时,不要每次都写入数据库;那还有什么其他选择呢?

4 个回答

1

你需要在服务器上保存一些信息,数据的完整性不是特别重要,但处理速度和响应时间很关键。这意味着你应该使用某种键值存储。

Memcached 和 Redis 都有可以过期的键。你可能已经安装了 Memcached,所以可以使用它。

你可以在每次访问时重置 user:last-seen:$username 这个键的过期时间,或者可以使用 mawimawi 的 cookie 方法,把过期时间设置为 4 倍的 cookie 生命周期。

1

在内存中使用一个哈希表或者一个队列,每隔一个小时左右就会有一个任务把它保存下来。

4

一种方法可能是:

你可以创建一个中间件,在处理响应时执行以下操作:

  • 检查是否有一个叫做 'online' 的 cookie,但只有在用户已经登录的情况下才检查
  • 如果没有这个 cookie,
    • 设置一个名为 'online' 的 cookie,值为 '1'
    • 将这个 cookie 的有效期设置为10分钟
    • 更新这个用户在 auth.User 表中的 'last_login' 字段,记录当前的日期和时间

现在你就可以在 auth.User 表中看到所有当前登录的用户。所有 'last_login' 时间在当前时间减去15分钟之内的用户,可以被认为是“在线”的。

数据库会每10分钟为每个登录的用户写入一次数据。你可以根据需要调整“10”和“15”的数值。

这样做的好处是,数据库写入的次数很少(根据你设置的这两个数字10和15)。为了提高速度,确保 'last_login' 字段有索引,这样在这个字段上进行过滤和计数会非常快。

希望这对你有帮助。

撰写回答