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
相关产品推荐
相关产品推荐

