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

