2014-01-15 46 views
3

我需要一些帮助来了解如何测试用户当前是否登录。我在网上搜索,发现有对视图的方法解决方案,从请求拉出来的用户,并对其进行测试:Django:如何测试用户当前是否登录

if request.user.is_authenticated(): 

然而,在我的情况,我需要像下面这样:

user = User.objects.get(id=1) 
if user.is_logging_in(): 
    # do something 
else: 
    # do something else 

这是否类型的功能存在于Django中吗?谢谢!

+0

你是指编写单元测试吗? –

+0

@YerayDiazDiaz:不是在这种情况下,但我可能需要它在未来的测试。 –

+0

我很好奇背后的用例是什么?对于“已登录”的编码在典型的基于HTTP的客户端 - 服务器应用程序中可能是一个具有挑战性的概念。例如。 is_authenticated()告诉您请求用户是否已通过身份验证,但在请求到达服务器时,他们可能已关闭浏览器窗口。我之前有过同样的问题,但意识到我正在寻找错误的东西。 –

回答

1

我不认为该信息以受支持的方式存在。我的理解是,用户认证系统使用SessionMiddleware来存储会话是否具有与其关联的已认证用户。为了澄清,当用户登录时,会话存储数据,表明另一方的客户端是用户这样那样的。

你需要做的是遍历所有的会话,并确定会话是否有关联的用户,如果是,那么该用户是谁。据我所知,无法遍历会话,但我可能是错的。

this answer我发现了一种可以达到同样效果的方法。

from django.contrib.auth.signals import user_logged_in, user_logged_out 

def record_user_logged_in(sender, user, request, **kwargs): 
    # Record the user logged in 

def record_user_logged_out(sender, user, request, **kwargs): 
    # Record the user logged out 

user_logged_in.connect(record_user_logged_in) 
user_logged_out.connect(record_user_logged_out) 

我把它留给你为如何存储信息pertained到登录/退出,但模式将是这样做的一个很好的方式。我应该指出,我不认为这涵盖了用户证书超时的情况(从会话超时)。

另外,我刚刚遇到了this answer其中链接here这是一个跟踪活动用户的项目。我不知道它增加了多少开销,但只是想我会添加它。

+0

感谢您的答复。我已经实现了该信号,并且我在数据库中创建了一个字段,以便拥有一个记录用户登录/注销过程的计数器。不过,我有点担心这个柜台出现问题。你能想到任何情况吗?但是你的回答非常有道理,可能对其他人有帮助。会接受它。 –

+0

@da_zhuang那么,我承认可能有一些边缘情况,但如果您担心边缘情况,我认为您需要对您认为是“登录用户”的具体情况非常具体。如果有可能request.user.is_authenticated()将返回给特定用户的True(当然,他们没有第一次登录),你是否考虑任何用户登录? – CrazyCasta

+0

那么没有那么复杂:)。在与其他团队成员讨论后,我们决定实施强制用户在5分钟内不活动后退出。 –

相关问题