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

Django URL尾斜杠配置异常 测试请求返回302而非200如何解决?

Django测试返回302而非200的排查解决方法

核心错误排查

你提供的测试代码存在最直接的问题是混用了两个独立的Client实例,会话状态没有同步:

  • 代码前半段创建了c = Client()实例完成超级用户登录,后续请求add_product页面时使用的是self.client,两个实例的session完全隔离,self.client并没有登录状态,未登录用户访问需要超级用户权限的页面,自然会触发302重定向到登录页。

对应的修复代码如下:

def test_add_product_view_pass(self):
    # 创建超级用户时可以直接传password参数,省略单独set_password+save的步骤
    user = User.objects.create_superuser(
        username='test_user', 
        email='test_user_email@email.com',
        password='test'
    )
    # 全程统一使用self.client实例,保证登录状态同步
    response = self.client.post(reverse('log_in'), {'username': 'test_user', 'password': 'test'})
    user = get_user(self.client)
    # 修正原有断言错误:assertTrue第二个参数是报错提示,不会校验值是否相等,应该用assertEqual
    self.assertEqual(user.username, 'test_user')
    self.assertTrue(user.is_superuser)
    response = self.client.get(reverse('add_product'))
    self.assertEqual(response.status_code, 200)

其他可能问题排查

如果修改后仍返回302,可以按以下步骤排查:

  • 打印重定向目标地址确认跳转原因:执行print(response.url),如果跳转目标是登录页,说明登录逻辑仍有问题;如果跳转目标是同路径带尾斜杠的地址,说明URL规则匹配异常。
  • 验证reverse('add_product')生成的路径:你urls.py中定义的路由是path('add/', add_product, name='add_product'),正常情况下reverse会自动生成带尾斜杠的/add/路径,不会触发APPEND_SLASH的自动重定向。如果生成的路径不带斜杠,检查是否有其他同名路由覆盖了当前定义。
  • 临时开启自动重定向验证:测试请求时添加follow=True参数,让Client自动跟随重定向,再断言状态码:response = self.client.get(reverse('add_product'), follow=True)

内容的提问来源于stack exchange,提问作者Bartlomiej Strzyga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 22:45:03