Django通过电子邮件进行身份验证



我想用电子邮件登录,而不是像这样的用户名,请帮助

class loginUser(View):
def get(self, request):
    lF = loginForm
    return render(request, 'UserMember/login.html', {'lF': lF})
def post(self, request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        return render(request, 'UserMember/private.html')
    else:
        return HttpResponse('login fail')

首先要创建一个默认的电子邮件字段。

# models.py
class CustomUser(AbstractUser):
    email = models.EmailField(_('email address'), unique=True)
# settings.py (remember to migrate)
AUTH_USER_MODEL = 'accounts.CustomUser' # new

接下来,创建您的自定义电子邮件后端:

# backends.py (in-app)
class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = UserModel.objects.get(
                Q(username__iexact=username) | Q(email__iexact=username))
        except UserModel.DoesNotExist:
            UserModel().set_password(password)
        except MultipleObjectsReturned:
            return User.objects.filter(email=username).order_by('id').first()
        else:
            if user.check_password(password) and self.user_can_authenticate(user):
                return user
    def get_user(self, user_id):
        try:
            user = UserModel.objects.get(pk=user_id)
        except UserModel.DoesNotExist:
            return None
        return user if self.user_can_authenticate(user) else None

# settings.py (migrate again)
AUTH_USER_MODEL = 'accounts.CustomUser'
AUTHENTICATION_BACKENDS = ['accounts.backends.EmailBackend'] # new

如果您计划使用Django的默认注册/登录表单,请执行:

# form.py
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth import get_user_model
from django import forms

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

class LoginForm(AuthenticationForm):
    username = forms.CharField(label='Email / Username')

然后只需要处理视图和URL。

参考

您需要使用allAuth关注此链接希望对你有所帮助。

相关内容

最新更新