python - 如果通过前端注册表单注册,Django Authenticate 将不返回任何内容

标签 python django

我到处寻找解决这个问题的方法。然而,目前还没有解决方案。

问题 通过前端注册表单成功创建用户后,使用前端登录表单登录时,“Authenticate”函数返回“None”。

有趣的是,如果我要通过管理面板创建一个新用户(使用类似的代码),我就可以通过前端登录表单登录。

我创建的自定义用户模型确实使用电子邮件地址作为用户名。如果用户使用前端注册表单进行注册,则用户详细信息将保存到数据库中,密码将在数据库中进行正确的哈希处理。

代码如下:

来自 Forms.py

from django import forms
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from .models import User as CustomUser
from django.conf import settings


class RegisterForm(forms.ModelForm):
    password1 = forms.CharField(label='', widget=forms.PasswordInput)
    password2 = forms.CharField(label='', widget=forms.PasswordInput)

    class Meta:
        model = CustomUser
        fields = ('email', 'full_name')

    def __init__(self, *args, **kwargs):
        super(RegisterForm, self).__init__(*args, **kwargs)
        self.fields['email'].widget.attrs.update(
            {'class': 'form-control loginInput', 'placeholder': 'Your Email (you@company.com)'})
        self.fields['full_name'].widget.attrs.update(
            {'class': 'form-control loginInput', 'placeholder': 'Your Full Name'})
        self.fields['email'].label = ''
        self.fields['full_name'].label = ''
        self.fields['password1'].widget.attrs.update(
            {'class': 'form-control loginInput', 'placeholder': 'Your Password'})
        self.fields['password2'].widget.attrs.update(
            {'class': 'form-control loginInput', 'placeholder': 'Confirm Password'})

    def clean_email(self):
        email = self.cleaned_data.get('email')
        qs = CustomUser.objects.filter(email=email)
        if qs.exists():
            raise forms.ValidationError("email is taken")
        return email

    def clean_password2(self):
        # Check that the two password entries match
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        # Saving the provided password in hashed format
        user = super(RegisterForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user


class UserAdminCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = CustomUser
        fields = ('email',)

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        user = super(UserAdminCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

来自 Views.py

def register(request):
    registered = False

    if request.method == 'POST':
        registration = forms.RegisterForm(data=request.POST)

        if registration.is_valid():
            member = registration.save()
            member.set_password(member.password)
            member.save()
            registered = True
        else:
            print(registration.errors)

    else:
        registration = forms.RegisterForm()

    print("Registered: " + str(registered))
    return render(request, 'accounts/registration.html',
                  {'registration_form': registration,
                   'registered': registered,
                   })


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 not None:
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect(reverse('account_index'))

            else:
                HttpResponse("ACCOUNT NOT ACTIVE")
        else:
            print("Someone tried to login and failed!")
            print("Email: {} and password {}".format(username, password))
            return HttpResponse("invalid login details supplied!")

    else:
        return render(request, 'accounts/user_login.html', {})

我现在很迷茫。可以使用一些指导或建议。

最佳答案

好的,我已经解决了这个问题。看来我只需要睡在上面。

以下是导致问题的代码:

在 Views.py 中

member.set_password(member.password)

看起来好像是在设置密码的哈希版本。但“set_password”必须是密码的原始版本。

为了解决这个问题,我将其更改为:

member.set_password(request.POST.get('password1'))

看哪,它起作用了!

关于python - 如果通过前端注册表单注册,Django Authenticate 将不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48602239/

相关文章:

mysql - Django Rest Framework MySQL 表重命名/添加前缀

python - 如何从 Google Assistant 接收字符串形式的回答,而不是音频流

python - 通过随机嵌套数据进行最快搜索

python - 如何自定义 Flask admin QuerySelectMultipleField 选择?

python - ZODB不释放硬盘空间

python - 我可以 git 忽略整个分支来创建与实时服务器交互的本地分支,并将调试设置为 True 吗?

python - Django-Weasyprint 图像未渲染

python - 过滤查询其金额字段的总和大于或小于数字

django - 如何将 django_tables2 与过滤器一起使用?

python - 将 Pandas DataFrame 行合并为一列中的字符串