【问题标题】:User matching query does not exist using authentication使用身份验证的用户匹配查询不存在
【发布时间】:2015-09-09 09:19:51
【问题描述】:

我使用以下代码创建了一个用户:

views.py(注册视图工作正常,但登录视图不行)

def register(request):  
    if request.method == 'POST':
    form = UserProfileForm(request.POST) 

    if form.is_valid():
        user = form.save()

        username = ... 
        u = User.objects.create_user(username, user.email, user.password)
        u.save()
        ... 

    else:
        return HttpResponse('Nombre o contrasena incorrectos.')
else:
    form = UserProfileForm()

...


def log_in(request):   
if request.method == 'POST':
    form = UserLoginForm(request.POST)
    if form.is_valid():
        email = form.cleaned_data['email']
        password = form.cleaned_data['password']
        try:
            u = User.objects.get(email=email, password=password)
        except User.DoesNotExist:
            return HttpResponse('Email o contrasena incorrectos.')
        ...
else:
    form = UserLoginForm()
...

注册视图可以毫无问题地创建我的自定义用户,但是当我想使用它登录我的应用程序时,登录视图会引发User.DoesNotExist 异常。这是为什么呢?

【问题讨论】:

  • 您是否检查过调试器或打印出您在emailpassword 变量中得到了什么?

标签: python django authentication django-authentication


【解决方案1】:

问题就在这里:

u = User.objects.get(email=email, password=password)

没有意义,不能比较password字段值,因为它不是原始存储在数据库中的。

要检查用户是否提供了正确的密码,你应该使用authenticate内置函数:

u = authenticate(username=username, password=password)

您可以在此处看到可靠的示例: http://code.runnable.com/UpBfbcg4PNU0AAHG/how-to-check-if-the-user-is-authenticated-in-django-for-python-authentication-and-httprequest

..或在官方 Django 文档中(login 函数示例): https://docs.djangoproject.com/en/1.8/topics/auth/default/#django.contrib.auth.login

【讨论】:

  • 你好,Igor,我按照你说的修改了代码,并添加了一个 HttpResponse 来做一个断点,问题部分解决了,它不再抛出 DoesNotExist 异常,但我的应用程序没有使用登录表单中介绍的电子邮件和密码识别我创建的用户,您自己或其他人可以再次帮助我吗?还是谢谢你:)
  • 您应该分两步进行:首先通过电子邮件找到用户,然后使用用户的用户名与您在上一步找到的用户和用户提供的密码调用authenticate函数形式。
猜你喜欢
  • 2018-04-08
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多