【问题标题】:Get list of connected users with Django使用 Django 获取已连接用户的列表
【发布时间】:2014-11-04 01:42:22
【问题描述】:

我正在寻找一种方法来跟踪在线/离线用户。因此,如果我在列表中显示所有用户,我可以有一个图标或某种标志来显示这一点。这是在 Django 的默认 Auth 系统中内置的吗?

我的第一个想法是在我的个人资料中简单地在模型中添加一个名为 last_logout 的字段,并在每次用户注销时使用日期/时间对其进行更新。

有了这些信息和内置的 last_login,我应该能够做出某种功能来确定用户是否登录/在线,对吗?

或者我应该只有一个名为“在线”的布尔字段,我可以在用户登录和退出时更改它?

【问题讨论】:

标签: python django django-authentication


【解决方案1】:

您必须考虑用户“在线”究竟意味着什么。由于任何用户都可以随时关闭浏览器窗口而服务器不知道该操作,因此您最终会拥有大量虚假的“在线”用户。

您有两个基本选择:

  • 跟踪用户的上次活动时间。每次用户加载页面时,您都会更新计时器的值。要获取所有在线用户的列表,您需要选择在 X 分钟之前有活动的用户。一些网络论坛就是这样做的。

  • 打开一个 websocket、长轮询连接或到服务器的一些心跳。这就是 Facebook 聊天的作用。您需要的不仅仅是 django,因为要保持连接打开,还需要另一种服务器端资源。

【讨论】:

  • 或者只是一些定期 ping 服务器的 Ajax。
  • 感谢您的回答!我很好奇。您不能通过某种自动注销来解决“虚假”在线用户吗?还是会导致其他不必要的问题?
  • @user3199840,这会导致在用户处于活动状态并处于活动状态时可能会注销用户的不良问题 :)
【解决方案2】:

只有 django 很难做到。对于此类任务,异步框架更适合。

例如,tornado

用户不会在每次下线时都明确退出。他们只是关闭浏览器,仅此而已。你不能只用 django auth 应用程序知道它。它不是为此类任务而设计的。

即使您会检查未过期的会话,它也不会为您提供所有在线用户,因为会话可以不过期 30 天。

所以要获得真正的在线用户,可能的解决方案是:

  1. 每个用户都会通过 javascript 向您的服务器发送一些数据,例如每 10 秒一次。您可以在服务器上获取该数据并将用户放入缓存并将缓存键设置为活动 10 秒。因此,当您需要知道谁现在在线时,您将检查您的缓存。但这不是一个好的解决方案,因为它需要大量的服务器资源。
  2. 在服务器端使用异步框架 (tornado)(您可以为确切的请求设置单独的进程)。并使用 websockets(SockJS 是一个很好的客户端库)。这是一个更复杂的解决方案,但更好。

【讨论】:

  • 感谢您的回答!感觉这比我想象的要复杂。我仍在开发中,尚未开始学习会话和缓存。我想我需要为第二种解决方案“上线”?
  • @user3199840,我会说,这取决于。如果您不希望您的应用程序流量大,您可以选择第一种解决方案,因为它实施起来更快。如果您不熟悉异步框架,则需要一些时间来深入了解它。
  • 好的。也许最好只使用内置的 last_login 或某种 last_activity 时间戳字段,而不是节省时间和性能。我只是希望用户对其他用户何时活跃有某种感觉。再次感谢
猜你喜欢
  • 1970-01-01
  • 2021-08-21
  • 2017-11-29
  • 2015-05-18
  • 2010-12-12
  • 1970-01-01
  • 2011-09-27
  • 2013-10-16
  • 1970-01-01
相关资源
最近更新 更多