gpt4 book ai didi

django - Django 中的自定义登录

转载 作者:行者123 更新时间:2023-12-04 20:24:16 25 4
gpt4 key购买 nike

Django 新手在这里。

我写了一个简单的登录表单,它需要电子邮件和密码。如果同时提供电子邮件和密码,则效果很好,但如果缺少任何一个,我会收到 KeyError 异常。根据 Django 文档,这永远不会发生:

By default, each Field class assumes the value is required, so if you pass an empty value -- either None or the empty string ("") -- then clean() will raise a ValidationError exception



我试图为字段(clean_email 和 clean_password)编写自己的验证器,但它不起作用(即我得到 KeyError 异常)。我究竟做错了什么?
class LoginForm(forms.Form):
email = forms.EmailField(label=_(u'Your email'))
password = forms.CharField(widget=forms.PasswordInput, label=_(u'Password'))

def clean_email(self):
data = self.cleaned_data['email']
if not data:
raise forms.ValidationError(_("Please enter email"))
return data

def clean_password(self):
data = self.cleaned_data['password']
if not data:
raise forms.ValidationError(_("Please enter your password"))
return data

def clean(self):
try:
username = User.objects.get(email__iexact=self.cleaned_data['email']).username
except User.DoesNotExist:
raise forms.ValidationError(_("No such email registered"))
password = self.cleaned_data['password']

self.user = auth.authenticate(username=username, password=password)
if self.user is None or not self.user.is_active:
raise forms.ValidationError(_("Email or password is incorrect"))
return self.cleaned_data

最佳答案

您可以利用 Django 的内置方式通过设置来覆盖身份验证的发生方式
AUTHENTICATION_BACKENDS 在您的 settings.py 中

这是我的 EmailAuthBackend:

#settings.py
AUTHENTICATION_BACKENDS = (
'auth_backend.auth_email_backend.EmailBackend',
'django.contrib.auth.backends.ModelBackend',
)

#auth_email_backend.py
from django.contrib.auth.backends import ModelBackend
from django.forms.fields import email_re
from django.contrib.auth.models import User

class EmailBackend(ModelBackend):
"""
Authenticate against django.contrib.auth.models.User
"""

def authenticate(self, **credentials):
return 'username' in credentials and \
self.authenticate_by_username_or_email(**credentials)

def authenticate_by_username_or_email(self, username=None, password=None):
try:
user = User.objects.get(email=username)
except User.DoesNotExist:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
user = None
if user:
return user if user.check_password(password) else None
else:
return None

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

#forms.py
#replaces the normal username CharField with an EmailField
from django import forms
from django.contrib.auth.forms import AuthenticationForm

class LoginForm(AuthenticationForm):
username = forms.EmailField(max_length=75, label='Email')
next = forms.CharField(widget=forms.HiddenInput)

希望有帮助!

关于django - Django 中的自定义登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2939406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com