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

Django测试视图返回302而非200,带follow=True才通过是否正确?

结论

你当前的测试代码可以实现「验证登录用户可正常访问index视图」的测试目标,运行通过的情况下结果是可信的。

为什么不加follow=True会返回302

follow=True是Django测试客户端的参数,作用是让客户端自动跟随所有重定向响应,最终返回跳转链路最后一个响应对象。你加了该参数后测试通过,说明即使请求触发了一次或多次重定向,最终还是到达了返回200的index页面。

但从你给出的代码来看,已登录用户请求被@login_required装饰的index视图,理论上不应该触发302重定向,建议你按以下方向排查异常重定向的原因:

  • 先验证登录是否成功:在setUp方法中打印self.client.login(username='test', password='test')的返回值,若返回False说明登录未生效,未登录的用户请求@login_required视图会自动302跳转到登录页
  • 打印无follow=True时的response.url属性,确认重定向的目标地址:如果目标是登录页,说明登录状态丢失;如果是带末尾斜杠的同路径,说明是DjangoAPPEND_SLASH配置触发的重定向;如果是其他地址,说明项目有额外的中间件/视图逻辑做了重定向处理

测试代码优化建议

你可以拆分测试场景,让用例覆盖更全面,同时也能更方便定位问题:

from django.test import TestCase, Client
from django.contrib.auth.models import User
from django.urls import reverse

class IndexPageTestCase(TestCase):
    def setUp(self):
        self.client = Client()
        self.user = User.objects.create_superuser(
            username='test', 
            password='test', 
            email='test@test.fr'
        )
        self.index_url = reverse('ecrf:index')
        self.login_url = reverse('login') # 替换成你项目实际的登录页路由名

    def test_index_anonymous_redirect(self):
        # 未登录用户访问自动跳转到登录页
        response = self.client.get(self.index_url)
        self.assertEqual(response.status_code, 302)
        self.assertRedirects(response, f"{self.login_url}?next={self.index_url}")

    def test_index_authenticated_access(self):
        # 已登录用户直接访问成功
        login_ok = self.client.login(username='test', password='test')
        self.assertTrue(login_ok) # 先确认登录成功
        response = self.client.get(self.index_url)
        self.assertEqual(response.status_code, 200)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:36:10