【问题标题】:Django Authenticate Backends with EmailDjango 使用电子邮件验证后端
【发布时间】:2020-11-13 21:15:20
【问题描述】:

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

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')

【问题讨论】:

标签: django email authentication


【解决方案1】:

您需要使用 allAuth Follow this Link 希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

    # 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。

    Ref

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-12
      • 2018-05-13
      • 1970-01-01
      • 2019-07-04
      • 2018-10-19
      • 2017-02-20
      • 2019-08-29
      • 2012-08-10
      相关资源
      最近更新 更多