"User already exist" 自定义 Django 身份验证后端
"User already exist" Custom Django Authentication Backend
我正在编写一个自定义的 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}
)
当我 运行 代码时,我可以毫无问题地创建用户,并且该用户存储在数据库中,但是当我尝试登录时,就像我再次创建用户一样。我知道我失踪了,但不知道是什么。
我通过更改 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)
所以主要问题是我正在调用继承自 forms.ModelForm
的 LoginUserForm
,一个具有 save()
方法的 class,所以我是 saving/creating 用户再次而不是验证。
我正在编写一个自定义的 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}
)
当我 运行 代码时,我可以毫无问题地创建用户,并且该用户存储在数据库中,但是当我尝试登录时,就像我再次创建用户一样。我知道我失踪了,但不知道是什么。
我通过更改 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)
所以主要问题是我正在调用继承自 forms.ModelForm
的 LoginUserForm
,一个具有 save()
方法的 class,所以我是 saving/creating 用户再次而不是验证。