Django公司测试客户端已登录,但在视图中作为匿名用户传递

2024-09-29 17:18:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个奇怪的问题。。。在

我试图测试@login_required视图,因此我编写了以下代码:

from django.test import TestCase
from django.test import Client
from .models import SiteEcommerce
from .models import Client as TestDbClient
from .models import MyCustomEmailUser


class DataBaseTestCase(TestCase):
    def __init__(self, *args, **kwargs):
        super(DataBaseTestCase, self).__init__(*args, **kwargs)
        self.c = Client()  # instantiate the Django test client
        self.user = MyCustomEmailUser.objects.all()[0]

    def test_method(self):
        """
        Test of the settings page.
        """
        self.c.login(username=self.user.email, password=self.user.password)
        print self.user.is_authenticated()
        response = self.client.get('/main/settings/%s' % self.website.idsite)
        self.assertEqual(response.status_code, 200)

名为settings_view的视图,我在其中打印request.user

问题是在测试print self.user.is_authenticated()中给出True,但是视图中的request.user返回{}


Tags: djangofromtestimportselfclient视图settings
2条回答

简短的说法:“可能是你的固定装置。”


长版。。。在

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

这样做的结果是,在您的测试中,您可能有一个fixture,其中一行如下:

"password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",

在你的测试中,你可能会有一些类似的东西:

^{pr2}$

结果是,当您修改Django版本并获得额外的哈希值时,旧的fixture不再工作,因为新的Django对测试代码提供的密码进行哈希处理的次数比fixture中的值还要多。在

解决方案:

  1. 在您的dev机器上,使用您在fixture中想要的密码创建一个用户。在
  2. 找到该用户的管理页面。在
  3. 将该用户复制到发生故障的设备中。在

或者,这里有一个哈希值,您可以在fixture中使用密码“password”:

"password": "pbkdf2_sha256$36000$OIQCpvIXZil8$y7qUtb3Y0imzu1ATn4vQZeVtu7MuPg0zUqX5oBUL2zM=",

有趣的东西。抱歉,不好玩。愚蠢。在

首先,不需要使用self.c = Client()创建一个新的客户机,只需使用self.client。不应使用__init__方法访问数据库。相反,您应该在setUp^{}方法中设置用户。在

def setUp(self, *args, **kwargs):
    self.user = MyCustomEmailUser.objects.all()[0]

如果要检查客户机登录是否有效,应该检查self.client.login(...)的值。没有点检查self.user.is_authenticated(),因为它总是返回True。在

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

您可以改为使用^{}。在

^{pr2}$

相关问题 更多 >

    热门问题