python - Django - 使用电子邮件或用户名登录不起作用

标签 python django django-forms django-views

在我的项目中,我实现了一个登录系统,用户可以使用他们的用户名电子邮件登录。我基本上尝试查找用户的电子邮件是否插入到表单字段“usernameOrEmail”中,或者是否是他们在“usernameOrEmail”字段中输入的用户名。如果找到用户,我就会登录他们。

这是我的代码:

def login(request):
    context = {}
    if request.method == "POST":
        isFound = ""
        form = LoginForm(request.POST)
        if form.is_valid():
            try:
                user = User.objects.get(username=form.cleaned_data.get("usernameOrEmail"))
                isFound = "usernameFound"
            except User.DoesNotExist:
                try:
                    user = User.objects.get(email=form.cleaned_data.get("usernameOrEmail"))
                    isFound = "emailFound"
                except User.DoesNotExist:
                    isFound = "nothingFound"




            if isFound == "usernameFound":
                print("USERNAME FOUND!")
                user = auth.authenticate(username=form.cleaned_data.get("usernameOrEmail"), password=form.cleaned_data.get("password"))
                if user is not None:
                    auth.login(request, user)
                    return redirect('home')
                else:
                    context["error"] = "Oops, username/email or password provided is invalid"
            elif isFound == "emailFound":
                print("EMAIL FOUND")
                user = auth.authenticate(email=form.cleaned_data.get("usernameOrEmail"), password=form.cleaned_data.get("password"))
                if user is not None:
                    print("YES")
                    auth.login(request, user)
                    return redirect('home')
                else:
                    print("NO")
                    context["error"] = "Oops, username/email or password provided is invalid"
            else:
                context["error"] = "Oops, username/email or password provided is invalid"
        else:
            context["error"] = "Please enter valid form data"
    else:
        form = LoginForm()

奇怪的是,终端返回打印语句“EMAIL FOUND”,意味着找到了用户的电子邮件,但是也打印了“NO”打印语句,并且消息“哎呀,提供的用户名/电子邮件或密码无效” "在模板中返回。

另一个奇怪的事情是,这个系统适用于用户用户名,这意味着当我在“用户名或电子邮件”字段中输入用户用户名,并且输入正确的密码时,用户就会登录。有人知道这个问题吗?谢谢。

最佳答案

标准身份验证后端仅适用于用户名密码。事实上,authenticate method [GitHub] ModelBackend 的实现如下:

    def authenticate(self, request, <b>username=None</b>, password=None, **kwargs):
        if username is None:
            username = kwargs.get(UserModel.USERNAME_FIELD)
        if username is None or password is None:
            return
        try:
            user = UserModel._default_manager.get_by_natural_key(username)
        except UserModel.DoesNotExist:
            # Run the default password hasher once to reduce the timing
            # difference between an existing and a nonexistent user (#20760).
            UserModel().set_password(password)
        else:
            if user.check_password(password) and self.user_can_authenticate(user):
                return user

但这不是问题。您可以通过以下方式实现:

def login(request):
    context = {}
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            try:
                user = User.objects.get(username=form.cleaned_data['usernameOrEmail'])
            except User.DoesNotExist:
                try:
                    user = User.objects.get(email=form.cleaned_data['usernameOrEmail'])
                except User.DoesNotExist:
                    user = None
            if user is not None:
                user = auth.authenticate(username=<b>user.username</b>, password=form.cleaned_data['password'])
            if user is not None:
                auth.login(request, user)
                return redirect('home')
            else:
                context['error'] = 'Oops, username/email or password provided is invalid'
        else:
            context['error'] = 'Please enter valid form data'
    else:
        form = LoginForm()
    # …

关于python - Django - 使用电子邮件或用户名登录不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60250059/

相关文章:

python - Django:在 Python Shell 中访问管理员用户

django - 在 __init__ 处动态添加到 ModelForm 的字段不会保存

python - 自定义 Django ModelForm 的 HTML 输出

python - 使用sqlalchemy删除父项时如何使子项的外键无效?

django - 我可以在 Django 1.11 中使用 Python 3.7 吗?

python - 用 Python 的 Popen 替换 Bash 风格的进程

python - Django:durationField 默认值

python - 指示输入类型的 Django 表单

python - tensorflow.keras.losses.cosine_similarity 在 TensorFlow 1.15 中返回正值

python - SQLAlchemy:唯一约束失败错误,但未设置唯一约束