Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:更改/允许用户';s登录用户名也可以使用他/她的电子邮件_Django_Django Users_Django Login - Fatal编程技术网

Django:更改/允许用户';s登录用户名也可以使用他/她的电子邮件

Django:更改/允许用户';s登录用户名也可以使用他/她的电子邮件,django,django-users,django-login,Django,Django Users,Django Login,正如我的标题所说,我想知道是否有一种方法可以让用户不仅使用用户名,还可以使用用户的电子邮件登录。我想标准化登录过程,因为目前我让我的用户使用许多不同的约定,这会变得非常混乱。如果您强制使用唯一的电子邮件地址,您可能会这样做。这意味着任何用户都不能拥有相同的电子邮件地址。通过这种方式,您可以通过电子邮件地址获取用户并登录 表单可能如下所示: <form method="post" action="{% url myproject.views.login %}"> <p&

正如我的标题所说,我想知道是否有一种方法可以让用户不仅使用用户名,还可以使用用户的电子邮件登录。我想标准化登录过程,因为目前我让我的用户使用许多不同的约定,这会变得非常混乱。

如果您强制使用唯一的电子邮件地址,您可能会这样做。这意味着任何用户都不能拥有相同的电子邮件地址。通过这种方式,您可以通过电子邮件地址获取用户并登录

表单可能如下所示:

<form method="post" action="{% url myproject.views.login %}">
     <p>Username</p>
     <input type='text' name='username'/>

     <p>Password</p>
     <input type='password' name='password'/>
     <input type="submit" value="Login"/>
</form>
def login( request ):
    username = request.POST['username']
    password = request.POST['password']
    user = User.objects.filter( email = username )[0]
    if( user is not None ):
         # -- the user was retrieved by an email address
         # -- now you can authenticate and log them in log them in
         from django.contrib import auth
         user = auth.authenticate( user.username, password )
         if( user is not None ):
              auth.login( user, request )
OpenID可能是另一种方式:


确保每个用户都有唯一的电子邮件地址:

我想我已经“解决”了我的问题,至少现在它还可以正常工作。 我决定使用自己的身份验证后端。我创建了一个文件“auth_backends.py”,并将其添加到my settings.py中的AUTHENTICATION_backends:

我的登录表单字段仅包含“用户名”和密码。我要检查输入的用户名是否是他的用户名或电子邮件的唯一方法是执行.find('@')。 有没有更好的检查方法?这够了吗? 我这样做的全部原因是,用户记住他/她的电子邮件比记住他的用户名(实际上是一个由数字组成的“id”)更容易

我还要处理重复的电子邮件

from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model
from django.contrib.auth.models import User

class CustomUserModelBackend(ModelBackend):

def authenticate(self, **credentials):
    if 'username' in credentials:
        if credentials['username'].find('@') > 0:
            return self.authenticate_by_email(**credentials)
        else:
            return self.authenticate_by_username(**credentials)

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

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

这可能有用。我还了解了如何编写自己的身份验证后端,并将其作为一个中间件包含在内。回答完这个问题后,我也在考虑实施电子邮件登录。