我知道这个问题已经被问过,但没有一个答案对我有用。
每当我尝试在 Django 测试中使用客户端登录时,它基本上都会被忽略,并且我会重定向到登录页面。经过几次测试后,我注意到它可以正确登录我,但在我使用它时将我踢出。
这是我的代码的精简版本,仍然可以重现这一点。
from django.auth import get_user
class MapListViewTest(TestCase):
@classmethod
def setUpTestData(cls):
# Create a user
cls.user = get_user_model().objects.create(username="testuser")
cls.user.set_password("password")
cls.user.save()
# [...]
def setUp(self):
self.client.login(
username=self.user.get_username(), password=self.user.password
)
def test_map_list_view_renders(self):
"""Test that the MapListView renders successfully and includes a list of maps."""
logger.info(get_user(self.client)) # <-- <django.contrib.auth.models.AnonymousUser object at 0x7377d5589540>
self.client.login(
username=self.user.get_username(), password=self.user.password
)
logger.info(get_user(self.client)) # <-- <Profile: testuser>
response = self.client.get(reverse("map_list"), follow=True)
logger.info(get_user(self.client)) # <-- <django.contrib.auth.models.AnonymousUser object at 0x7377d5589540>
self.assertEqual(response.status_code, 200) # <-- OK
self.assertTemplateUsed(response, "map_list.html") # <-- lands on 'account/login.html'
(我在代码片段中放了两次,但它只在真实代码的setUp中)
我不知道这是否有任何相关性,但是重定向将地址从
http://localhost/...
更改为http://testserver/...
,并且我正在docker容器中工作。
此外,用户模型继承自AbstractUser,并且没有自定义登录逻辑。
在
self.client.login
self.client.login(
username=self.user.get_username(), password=self.user.password
)
这里
self.user.password
不起作用,因为它是哈希密码,而该方法需要纯文本密码。
试试这些
self.client.login(username=self.user.get_username(), password="password")
我们将
self.user.password
替换为 "password"
,以获得明文形式的密码。