You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

启用Django SECURE_SSL_REDIRECT导致内置Client单元测试失败

哈哈,这个坑我太熟了!我之前帮团队把开发环境改成全SSL后,也遇到了一模一样的问题——几百个测试突然集体报错,全是因为Client发的HTTP请求被强制重定向到HTTPS,导致测试预期的200响应变成了302,断言直接失败。

给你几个实用的解决方案,按省心程度排序:

1. 测试时临时禁用SSL重定向(最省心,不用改大量测试)

Django提供了override_settings装饰器,可以在单个测试类或测试方法里临时关闭SECURE_SSL_REDIRECT,完全不影响生产或开发环境的配置:

from django.test import override_settings, TestCase

@override_settings(SECURE_SSL_REDIRECT=False)
class UserAPITests(TestCase):
    def test_user_list(self):
        response = self.client.get("/api/users/")
        self.assertEqual(response.status_code, 200)
        # 其他断言逻辑...

如果想全局给所有测试都禁用这个设置,可以在项目的settings.py里加个判断:

# settings.py
import sys

if 'test' in sys.argv or DEBUG:
    SECURE_SSL_REDIRECT = False

这样测试跑的时候自动关闭重定向,开发和生产环境不受影响。

2. 让测试Client默认发HTTPS请求(更贴近生产环境)

如果不想禁用重定向,而是让测试模拟真实的HTTPS请求,那可以给Client加上secure=True参数:

对于Django内置Client:

# 单个请求设置
response = self.client.get("/some-page/", secure=True)

# 或者在测试类的setUp里全局设置,不用每个请求都加
class BaseTestCase(TestCase):
    def setUp(self):
        super().setUp()
        self.client = self.client_class(secure=True)

对于DRF的APIClient:

from rest_framework.test import APIClient

# 单个请求设置
client = APIClient()
response = client.get("/api/users/", secure=True)

# 或者在setUp里初始化带secure的Client
class BaseAPITestCase(TestCase):
    def setUp(self):
        super().setUp()
        self.client = APIClient(secure=True)

这种方式完全模拟生产环境的请求逻辑,适合需要测试SSL相关逻辑的场景。

3. 处理重定向断言(不推荐,除非必须)

如果一定要保留SECURE_SSL_REDIRECT=True的测试环境,那只能修改测试代码,先断言重定向,再跟进到HTTPS的响应:

def test_user_list(self):
    # 先发起HTTP请求,得到重定向响应
    response = self.client.get("/api/users/")
    self.assertEqual(response.status_code, 302)
    
    # 跟进重定向,用HTTPS请求目标URL
    redirected_response = self.client.get(response.url, secure=True)
    self.assertEqual(redirected_response.status_code, 200)
    # 其他断言...

但这种方式要修改几百个测试,工作量太大,除非有特殊的测试需求,否则不推荐。

个人最推荐第一种方案,用override_settings或者全局测试配置关闭重定向,既能让测试正常跑,又不影响生产环境的配置。

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

火山引擎 最新活动