Python Django test.Client已登录,但在视图中作为匿名用户传递

Python Django test.Client已登录,但在视图中作为匿名用户传递,python,django,unit-testing,django-testing,Python,Django,Unit Testing,Django Testing,我这里有个奇怪的问题 我正在尝试测试@login\u必需的视图,因此我编写了以下代码: 来自django.test的导入测试用例 从django.test导入客户端 从.models导入站点电子商务 from.models将客户机作为TestDbClient导入 从.models导入MyCustomEmailUser 类DataBaseTestCase(TestCase): 定义初始化(self,*args,**kwargs): super(DataBaseTestCase,self)。\uuu

我这里有个奇怪的问题

我正在尝试测试@login\u必需的视图,因此我编写了以下代码:

来自django.test的
导入测试用例
从django.test导入客户端
从.models导入站点电子商务
from.models将客户机作为TestDbClient导入
从.models导入MyCustomEmailUser
类DataBaseTestCase(TestCase):
定义初始化(self,*args,**kwargs):
super(DataBaseTestCase,self)。\uuuuu init\uuuuu(*args,**kwargs)
self.c=Client()#实例化Django测试客户端
self.user=MyCustomEmailUser.objects.all()[0]
def测试方法(自身):
"""
测试设置页面。
"""
self.c.login(用户名=self.user.email,密码=self.user.password)
打印self.user.is_已验证()
response=self.client.get('/main/settings/%s'%self.website.idsite)
self.assertEqual(response.status_代码,200)
名为
settings\u view
的视图,其中我正在打印
请求。用户


问题是,在测试中,
print self.user.is_authenticated()
give
True
,但是视图中的
request.user
返回
AnonymousUser
首先,不需要使用
self.c=client()
创建新的客户端-只需使用
self.client
。您不应使用
\uuuu init\uuuu
方法访问数据库。相反,您应该在
设置
或方法中设置用户

def setUp(self, *args, **kwargs):
    self.user = MyCustomEmailUser.objects.all()[0]
如果要检查客户端登录是否工作,应检查
self.client.login(…)
的值。没有必要检查self.user.is\u authenticated(),因为它将始终返回
True

您在中的登录不起作用,因为
self.user.password
是哈希密码,而不是实际密码

您可以使用

简短的版本:“这可能是你的固定装置。”


长版本

升级到1.11后我遇到了这个问题。我花了一分钟才弄明白,但当您升级版本时,Django会升级后端密码哈希器用于测试密码的迭代次数

这样做的结果是,在您的测试中,您可能会有一个带有以下线条的夹具:

"password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",
在您的测试中,您可能会遇到以下情况:

self.client.login(username='pandora', password='password')
事实证明,当您升级了Django版本并获得了这些额外的哈希值时,旧的fixture不再工作,因为新的Django对测试代码提供的密码进行哈希处理的次数超过了fixture中的值

解决方案:

  • 在您的开发机器上,创建一个用户,并在您的设备中使用所需的密码
  • 查找该用户的管理页面
  • 将该用户复制到发生故障的设备中 或者,这里有一个哈希值,您可以在您的装置中使用,该值适用于密码“password”:


    有趣的东西。对不起,不好玩。哑巴。

    谢谢您的回答@Alasdair,但我遇到了一个错误:
    Save with update\u字段不会影响任何行。
    我不确定是什么导致了这个错误。这可能是因为您使用了
    \uuu init\uu
    而不是
    设置
    。如果更改该选项无法解决问题,那么您需要提供更多信息,包括完整的回溯。我遇到了相同的问题:
    force_login
    而不是
    login
    给出了相同的结果(没有任何错误)。我遇到了相同的问题:您找到了解决方案吗?
    self.client.login(username='pandora', password='password')
    
    "password": "pbkdf2_sha256$36000$OIQCpvIXZil8$y7qUtb3Y0imzu1ATn4vQZeVtu7MuPg0zUqX5oBUL2zM=",