the1fire

基于Django的个人博客系统

Django2.1和2.2中关于authenticate的坑

分类:Django   作者:edward   创建时间:2019年5月10日 16:05   pv:350   uv:341

刚刚完成了一个模仿慕课网的在线教育项目,从Python2.7+Django1.9升级到了Python3.6+Django2.2。但是遇到了登陆问题。升级前可以登录的账号和密码,升级后都不可以登陆了。又降级到Django2.0试了一下,可以正常登陆,这说明Django2.1和Django2.2关于authenticate的登陆逻辑变了。我用的是Django内部的认证系统,代码如下:

......
from django.contrib.auth import authenticate, login, logout
......
class LoginView(View):
    def get(self, request):
        login_form = LoginForm()
        return render(request, 'login.html', {'login_form': login_form})

    def post(self, request):
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            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 redirect(reverse('index'))
                else:
                    return render(request, 'login.html', {'msg': '用户未激活', 'login_form': login_form})
            return render(request, 'login.html', {'msg': '用户名或密码错误', 'login_form': login_form})

        return render(request, 'login.html', {'login_form': login_form})

查阅资料后发现在settings.py里的AUTHENTICATION_BACKENDS加入如下代码就好了:

AUTHENTICATION_BACKENDS = (
    ......
    'django.contrib.auth.backends.AllowAllUsersModelBackend'
    ......
)

setting.py 官网的解释是设置这个后可以让未激活的用户登录(if you want to allow inactive users to login)

参考资料: https://stackoverflow.com/questions/49553511/why-authenticate-return-none-for-inactive-users https://docs.djangoproject.com/en/2.0/ref/contrib/auth/#django.contrib.auth.models.User.is_active