You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:57:01