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

mar*_*rue 11 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)
Run Code Online (Sandbox Code Playgroud)

现在使用与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')
Run Code Online (Sandbox Code Playgroud)

但是这只会在第一行引发这种情况(创建用户时,而不是在分配密码时):

ValueError:未知的密码哈希算法''.您是否在PASSWORD_HASHERS设置中指定了它?

这是django不接受空密码的一些问题,所以我改为:

self.user = User.objects.create(username='testuser',password='!')
self.user.set_password('some_password')
Run Code Online (Sandbox Code Playgroud)

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

login = self.client.login(username='testuser',password='some_password')
self.assertTrue(login)
Run Code Online (Sandbox Code Playgroud)

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

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

Tho*_*mas 16

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

或者:从这里开始

self.user = User.objects.create_user(username='user', email='email@example.com', password='pass')
Run Code Online (Sandbox Code Playgroud)

  • 你的意思是这个吗?你也许可以找到我的兴趣...;) (2认同)

mar*_*rue 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)
Run Code Online (Sandbox Code Playgroud)

工作得很好.


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

用户名:user_01密码:password_01

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