获取Django的已连接用户列表

时间:2014-09-10 11:59:28

标签: python django django-authentication

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

我的第一个想法是在我的配置文件中简单地在模型中使用名为last_logout的字段,并在每次用户注销时使用日期/时间更新它。

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

或者我应该只有一个名为"在线"的布尔字段。我可以在用户登录和注销时更改?

2 个答案:

答案 0 :(得分:3)

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

例如,tornado

用户每次下线时都不会明确注销。他们只是关闭浏览器就是这样。您只能使用django auth应用程序来了解它。它不是为此类任务而设计的。

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

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

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

答案 1 :(得分:2)

您必须考虑用户“在线”的确切含义。由于任何用户都可以随时关闭浏览器窗口而服务器不知道该操作,因此您最终会遇到大量错误的“在线”用户。

您有两个基本选项:

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

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