【问题标题】:"User already exist" Custom Django Authentication Backend“用户已存在”自定义 Django 身份验证后端
【发布时间】:2020-11-17 23:18:36
【问题描述】:

我正在编写自定义 django 身份验证代码,该代码可以很好地创建用户,但是当我尝试登录时,就像我再次注册一样,因此无法访问我的用户帐户,因为每次我尝试登录,我收到一个错误,因为具有该凭据的用户已经存在(我就是那个用户)。

输出为:<ul class="errorlist"><li>address<ul class="errorlist"><li>User with this Address already exists.</li></ul></li></ul>

Models.py:

class AppUser(AbstractUser):
    username = models.TextField(unique=True)
    address = models.CharField(max_length=34, unique=True)
    key = models.CharField(max_length=34)
    
    def __str__(self):
        return self.username

Forms.py:

class NewUserForm(forms.ModelForm): 
    class Meta:
        model = AppUser
        fields = ("username", "address", "key")

    def save(self, commit=True):
        user = super(NewUserForm, self).save(commit=False)
        user.address = self.cleaned_data["address"]
        user.key = self.cleaned_data['key']
        if commit:
            user.save()
        return user

class LoginUserForm(forms.ModelForm): 
    class Meta:
        model = AppUser
        fields = ("address", "key")

    def __init__(self, request=None, *args, **kwargs):
        self.request = request
        super().__init__(*args, **kwargs)

Backends.py:

class AppUserBackend(ModelBackend):

    def authenticate(self, request, **kwargs):
        address = kwargs['address']
        key = kwargs['key']
        try:
            customer = AppUser.objects.get(address=address)
            
            if customer.key == key:
                return customer.user
            else:
                print("Error")
        except AppUser.DoesNotExist:
            pass

Views.py:

def login_request(request):
    if request.method == 'POST':
        form = LoginUserForm(request=request, data=request.POST) 
        if form.is_valid():
            address = form.cleaned_data.get('address')
            key = form.cleaned_data.get('key')
            user = authenticate(request=request, address=address, key=key)
            if user is not None:
                login(request, user, backend='main.backends.AppUserBackend')
                return redirect("main:home")
            else:
                print("User is none")
        else:
            print("Not valid")

    form = LoginUserForm()
    return render(request = request,
                    template_name = "main/login.html",
                    context={"form":form}
                    )

def register(request):
    if request.method == "POST":
        form = NewUserForm(request.POST)
        if form.is_valid():
            user = form.save()

            login(request, user, backend='main.backends.AppUserBackend')
            return redirect("main:index")

            return render(request = request,
                        template_name = "main/register.html",
                        context={"form":form})
            
    form = NewUserForm
    return render(request = request,
                  template_name = "main/register.html",
                  context={"form":form}
                  )

当我运行代码时,我可以毫无问题地创建用户,并且用户存储在数据库中,但是当我尝试登录时,就像我再次创建用户一样。我知道我错过了,但不知道是什么。

【问题讨论】:

  • 你检查过路线吗?
  • 是的,我有。我在登录和注册的正确页面上

标签: python django django-models django-forms django-authentication


【解决方案1】:

我通过更改forms.py解决了这个问题,来自:

class LoginUserForm(forms.ModelForm): 
    class Meta:
        model = AppUser
        fields = ("address", "key")

    def __init__(self, request=None, *args, **kwargs):
        self.request = request
        super().__init__(*args, **kwargs)

到:

class LoginUserForm(forms.Form): 
    address = forms.CharField(label='address', max_length=100)
    private_key = forms.CharField(label='private_key', max_length=100)

    def __init__(self, request=None, *args, **kwargs):
        self.request = request
        super().__init__(*args, **kwargs)

所以主要问题是我调用了LoginUserForm,它继承自forms.ModelForm,一个具有save() 方法的类,所以我再次保存/创建用户而不是进行身份验证。

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 2018-02-24
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多