Django - 用户是否激活

10

这是我的用户认证方法:

def user_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)

        if user:
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect(reverse('index'))
            else:
                print('TEST')
                messages.info(request, 'Inactive user')
                return HttpResponseRedirect(reverse('index'))
        else:
            messages.error(request, 'Invalid username/password!')
        return HttpResponseRedirect(reverse('index'))
    else:
        return render(request, 'mainapp/login.html', {})
如果用户存在但未激活,则会显示错误消息:
messages.error(request, 'Invalid username/password!')
return HttpResponseRedirect(reverse('index'))

改为:

print('TEST')
messages.info(request, 'Inactive user')
return HttpResponseRedirect(reverse('index'))

我不知道这里出了什么问题... 有任何提示吗?


你尝试过使用 User is not None 吗? - Ignacio Vazquez-Abrams
是的,我试过了。 - jundymek
Django自带身份验证视图,包括登录视图。您不必编写自己的! - Alasdair
2个回答

29
默认的ModelBackend身份验证后端在Django 1.10中开始拒绝不活跃的用户。因此,您的authenticate()调用将返回None,并且您会从外部if/else语句中获得无效的用户名/密码!消息。
正如Daniel所说,如果您使用默认的ModelBackend,则不再需要在登录视图中检查user.is_active
如果您真的希望authenticate返回不活跃的用户,则可以改用AllowAllUsersModelBackend。如果这样做,则您有责任在登录视图中检查is_active标志。
AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.AllowAllUsersModelBackend']

我尝试了这个方法并解决了问题,但有一个问题。使用这种方法有什么不利之处吗? - Isaac Hatilima
1
@IsaacHatilima 设置 is_active=False 以防止用户登录可能是有用的。如果更改此设置,您将失去该功能。这是否是一个缺点取决于您的要求。 - Alasdair

6
调用 authenticate 已经检查了用户是否设置了 is_active 标志,如果没有,则返回 None。因此不需要单独检查。

3
那么我如何检查用户是否存在但处于非活跃状态? - jundymek
1
你为什么想要这样做? - Daniel Roseman
1
我正在学习Django,由于有“is_active”标志,我想知道如何使用它。 - jundymek
1
可能的一个原因是为了显示验证错误,以便通知已禁用/不活跃的用户,让他们知道他们不再处于活动状态。 - Jarad
2
在Django 1.9中,“authenticate”不会检查“user.is_active”,但在Django 2.1中,这将自动检查。 请参阅Django 1.9文档Django 2.1文档 - youkaichao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接