一尘不染

Django的self.client.login(...)在单元测试中不起作用

django

我已经通过两种方式为我的单元测试创​​建了用户:

1)为“ auth.user”创建一个大致如下的灯具:

    { 
        "pk": 1, 
        "model": "auth.user", 
        "fields": { 
            "username": "homer", 
            "is_active": 1, 
            "password": 
"sha1$72cd3$4935449e2cd7efb8b3723fb9958fe3bb100a30f2", 
            ... 
        } 
    }

我省去了看似不重要的部分。

2)在setUp函数中使用“ create_user”(尽管我宁愿将所有内容保留在我的Fixture类中):

def setUp(self): 
       User.objects.create_user('homer', 'ho...@simpson.net', 'simpson') 

请注意,两种情况下的密码均为辛普森。

我已验证该信息一次又一次正确地加载到测试数据库中。我可以使用User.objects.get来获取User对象。我可以使用“ check_password”验证密码是否正确。用户处于活动状态。

但是,self.client.login(username =’homer’,password =’simpson’)总是失败。我对为什么感到困惑。我想我已经阅读了与此相关的每个互联网讨论。有人可以帮忙吗?

我的单元测试中的登录代码如下所示:

    login = self.client.login(username='homer', password='simpson') 
    self.assertTrue(login) 

阅读 728

收藏
2020-03-31

共1个答案

一尘不染

无效的代码:

from django.contrib.auth.models import User
from django.test import Client

user = User.objects.create(username='testuser', password='12345')

c = Client()
logged_in = c.login(username='testuser', password='12345')

为什么不起作用?
在上面的代码段中,User创建时,实际的密码哈希设置为12345。当客户端调用该login方法时,password参数的值12345将通过哈希函数传递,结果是

hash('12345') = 'adkfh5lkad438....'

然后将其与存储在数据库中的哈希进行比较,并且拒绝客户端访问,因为 'adkfh5lkad438....' != '12345'

解决方案

正确的做法是调用set_password函数,该函数通过哈希函数传递给定的字符串并将结果存储在中User.password

另外,调用后,set_password我们必须将更新的User对象保存到数据库中:

user = User.objects.create(username='testuser')
user.set_password('12345')
user.save()

c = Client()
logged_in = c.login(username='testuser', password='12345')
2020-03-31