使用PASSWORD_HASHERS为unittest用户创建一个简单的密码

时间:2012-04-12 09:04:13

标签: python django django-testing

直到django 1.2.5我可以使用以下代码创建用户进行测试,然后将其登录:

class TestSomeLoginRequiredView(TestCase):
    urls = 'sonloop.tests.test_urls'

    def setUp(self):
        self.user = User.objects.create(username='testuser',password='some_password')


    def test_the_view(self):
        response = self.client.get('/test_view_url/')
        self.assertEqual(response.status_code,401)

        self.client.login(username='testuser',password='some_password')
        response = self.client.get('/test_view_url/')
        self.assertEqual(response.status_code,200)

现在使用与django 1.4相同的代码不再起作用了:

  

ValueError:未知密码哈希算法'some_password'。你是否   在PASSWORD_HASHERS设置中指定它?

我理解这与新密码哈希系统有关。我没有使用PASSWORD_HASHERS设置,所以Django应该使用一些默认设置。

关于如何实现类似的东西,Django文档非常稀少。在测试部分没有任何改变。从关于创建密码以及如何散列它们的部分,我可以看到我可能会创建这样的密码:

self.user = User.objects.create(username='testuser')
self.user.set_password('some_password')

但是这只会在第一行提出这个概念(创建用户时,而不是在分配密码时):

  

ValueError:未知密码哈希算法''。你是否   在PASSWORD_HASHERS设置中指定它?

这是django不接受空密码的一些问题,因此我将其更改为:

self.user = User.objects.create(username='testuser',password='!')
self.user.set_password('some_password')

然后尝试以这样的方式记录用户:

login = self.client.login(username='testuser',password='some_password')
self.assertTrue(login)

现在引起了AssertionError: False is not True叹息 - 我几乎期待......

我现在的问题是:如何使用密码创建用户,并使用django测试客户端登录此用户?

2 个答案:

答案 0 :(得分:16)

self.user = User.objects.create(username='testuser',password='!')
self.user.set_password('some_password')
self.user.save() # <--- You need this ;)

或:from here

self.user = User.objects.create_user(username='user', email='email@example.com', password='pass')

答案 1 :(得分:15)

在寻找解决方案时,我发现了另外一件可行的方法,尽管我很可能会使用Thomas User.objects.create_user解决方案,因为这非常简单。

但无论它的价值如何,这就是我想出的:

from django.contrib.auth.hashers import make_password

pwd = make_password('some_password')
self.user = User.objects.create(username='testuser', password = pwd)

也可以。


正如我刚刚发现的那样,在手动创建灯具时非常有帮助。当您创建用于测试的夹具时,您可能想要像这样的用户:

  

用户名:user_01   密码:password_01

但是我怎么知道什么是password_01在哈希时会是什么样子?散列值必须存储在夹具中以进行测试,而make_password正是这样做的:它从密码创建密码哈希值。只需将make_password('password_01')的返回值写入灯具,即可完成。