微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django自定义登录问题

如何解决Django自定义登录问题

我创建了一个自定义身份验证方法,因为我想通过电子邮件登录而不是用户名,因为我已经编写了 backends.py

后端.py

from django.contrib.auth import get_user_model 
from django.core.exceptions import ValidationError

usermodel = get_user_model()

class EmailBackend(object):
    def authenticate(username=None,password=None):
        try:
            user = usermodel.objects.get(email=username)
            if user.check_password(password):
                return user
            else:
                return None
        except usermodel.DoesNotExist:
            raise ValidationError('Invalid Credentials')


    def get_user(self,user_id):
        try:
            return usermodel.objects.get(pk=user_id)
        except usermodel.DoesNotExist:
            return None

身份验证后,我希望用户登录。为此,我使用如下登录方法

登录(请求,用户,backend='django.contrib.auth.backends.ModelBackend')

views.py

from django.shortcuts import render,redirect
from users.forms import RegisterForm,LoginForm
from users.backends import EmailBackend as em
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth import login


def register(request):
    if request.method=='POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            form.save()
            print('Successfully Created')
    else:
        form = RegisterForm()
    
    return render(request,'users/register.html',{'form':form})


def user_login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        uname = request.POST['username']
        pwd = request.POST['password']
        user = em.authenticate(username=uname,password=pwd)
        if user is not None:
            if user.is_active==True:
                k=login(request,user,backend='django.contrib.auth.backends.ModelBackend')
                print(user,k)
                print('Successfull login')
        else:
            print('Unsuccessfull login')

    else:
        form = LoginForm()    
    return render(request,'users/login.html',{'form':form})

在我的控制台中,我试图获取登录函数返回的值,但返回的是 None 。

k=login(request,backend='django.contrib.auth.backends.ModelBackend') 打印(用户,k)

在我的控制台中输出

[16/Mar/2021 16:02:34] "POST /register/ HTTP/1.1" 200 881
[16/Mar/2021 16:02:52] "GET /login/ HTTP/1.1" 200 705
testuser@gmail.com None
Successfull login
[16/Mar/2021 16:02:58] "POST /login/ HTTP/1.1" 302 0
[16/Mar/2021 16:02:58] "GET /home HTTP/1.1" 200 237**

Print 方法给出了正确的 user 值,但对于 k,它给出了 None。这意味着登录功能无法正常工作,也意味着登录身份验证无法正常工作。

返回身份验证方法后如何登录用户?什么方式登录才能成功。

我的代码

settings.py

AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend','users.backends.EmailBackend']

models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser,AbstractUser
from django.utils.translation import gettext_lazy as _


class CustomUser(AbstractBaseUser):
    email = models.EmailField(_('email address'),unique=True)
    last_login = models.DateTimeField(verbose_name='last login',auto_Now=True)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    date_joined = models.DateTimeField(verbose_name='date joined',auto_Now_add=True)
    USERNAME_FIELD='email'

forms.py

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm,AuthenticationForm
from django import forms
from users.models import CustomUser

class RegisterForm(UserCreationForm):
    class Meta():
        model = get_user_model()
        fields = ('email','password1','password2')


class LoginForm(AuthenticationForm):
    class Meta():
        model = get_user_model()

解决方法

你登录错了。您正在引用您刚刚覆盖的身份验证后端。

在您的登录功能中,执行

login(request,user)

在您的设置中

AUTHENTICATION_BACKENDS = ['users.backends.EmailBackend','django.contrib.auth.backends.ModelBackend']

还有一件事,不要导入您的后端。如果没有自己的后端,只需像您一样导入 django 身份验证模块

并将您的身份验证行更改为

From django.contrib.auth import authenticate 
user = authenticate(username=uname,password=pwd)
,

我得到答案 login 方法没有返回值,这就是它返回 None 的原因。执行身份验证方法后,如果凭据有效,它将返回一个用户。之后,登录方法将使您登录。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。