直到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测试客户端登录此用户?
答案 0 :(得分:16)
self.user = User.objects.create(username='testuser',password='!')
self.user.set_password('some_password')
self.user.save() # <--- You need this ;)
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')
的返回值写入灯具,即可完成。