Django单元测试:已认证用户访问站点时登录认证失败问题排查
问题原因
登录失败由以下几个常见原因导致:
- 默认Django内置User模型的身份校验字段为
username,create_user方法默认第一个参数为username,你当前仅传入了email和password参数,未指定username,后续登录时传入邮箱作为username参数校验,自然匹配不到对应用户。 - 如果你项目使用了自定义用户模型,且将
USERNAME_FIELD设置为email,调用client.login时传入的参数错误,继续传username参数会匹配不到用户。 User.objects.create_user方法执行后会自动将用户数据写入数据库,多余的self.user.save()调用属于冗余操作,可直接删除。
解决方法
方案1:使用默认Django User模型
修改setUp方法中创建用户的代码,补充username参数,登录时使用创建的username校验:
def setUp(self): # 补充username参数,删除冗余的save调用 self.user = User.objects.create_user( username='test_user', email='test@testmail.com', password='test_password', is_staff=True ) self.client = Client() def test_portfolio_url(self): # 用创建的username登录,增加登录结果返回布尔值可直接校验登录状态 login_success = self.client.login(username='test_user', password='test_password') self.assertTrue(login_success) url = reverse('portfolio') response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(resolve(url).func, portfolio) self.assertTemplateUsed(response, 'portfolio.html')
方案2:使用自定义用户模型且USERNAME_FIELD为email
修改登录时传入的参数,将username替换为email即可:
def test_portfolio_url(self): # 传入email参数进行登录校验 login_success = self.client.login(email='test@testmail.com', password='test_password') self.assertTrue(login_success) # 后续测试逻辑保持不变
额外校验点
检查urls.py中portfolio对应的路由配置,确认是否需要传入user_id参数,如果路由配置为path('portfolio/<int:user_id>/', ...),需要在reverse时传入user_id参数:url = reverse('portfolio', args=[self.user.id])`。
登录成功后预期返回结果如下:
内容的提问来源于stack exchange,提问作者der
相关产品推荐
相关产品推荐

