在django Web应用程序中实现“上次看到”功能的最佳方法是什么?

时间:2010-06-12 08:12:09

标签: python django apache2

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

跟踪此问题的最佳方法是什么?

每次登录用户加载页面时,我宁愿不写入数据库;但还有其他选择吗?

4 个答案:

答案 0 :(得分:4)

方法可能是:

您创建了一个在process_response上执行以下操作的中间件:

  • 检查名为“在线”的Cookie,但仅限用户通过身份验证
  • 如果没有cookie,
    • 设置一个名为'online'的cookie,其值为'1'
    • 将Cookie的生命周期设置为10分钟
    • 使用当前日期时间更新此用户的auth.User的“last_login”字段

现在您已在auth.User表中拥有所有当前登录的用户。 last_login比datetime.now() - interval(15分钟)更新的所有用户可能被视为“在线”。

每隔10分钟就会为每个登录用户编写数据库。根据需要调整值“10”和“15”。

这里的优点是数据库写入很少(根据您的两个数字设置10/15)。对于速度优化,请确保将last_login编入索引,因此包括Count在内的此字段的过滤器非常快。

希望这有帮助。

答案 1 :(得分:1)

内存中的散列映射或队列,每小时左右运行一次任务以保留它。

答案 2 :(得分:1)

您需要坚持信息服务器端,完整性并不重要,吞吐量和延迟非常重要。这意味着你应该使用某种键值存储。

Memcached和redis的密钥已过期。你可能已经安装了memcached,所以使用它。

您可以在每次访问时重置user:last-seen:$username密钥的到期时间,或者您可以使用mawimawi的cookie技术并且有效期= 4 * cookie-lifetime。

答案 3 :(得分:0)

你不能在不使用数据库/持久存储的情况下在django中这样做,因为django会话存储在数据库中的原因相同:你的应用程序可能有多个实例在运行,必须通过它们同步状态+数据一个持久性源[1]

或者,您可能希望将此信息写入以用户标识命名的文件中的文件夹中,然后检查其创建/修改日期以查找所需信息。