You need to enable JavaScript to run this app. Django Rest Framework测试场景下如何禁用节流(throttling)功能
优惠活动
大模型
产品
解决方案
定价
更多

Django Rest Framework测试场景下如何禁用节流(throttling)功能

问题原因

DRF 的节流类会在模块导入阶段就读取配置中的限流速率并缓存,你给测试类加的 override_settings 配置修改时机晚于视图、节流类的导入时机,修改后的配置没有被已经加载的节流类读取,因此节流规则仍然生效。

解决方法

方案1:临时清空测试目标视图的节流配置(最稳妥,不影响其他测试)

直接修改视图的节流属性,绕开配置加载的缓存问题:

# 先导入你的视图
from 你的应用路径.views import UserQuestionVoteView

@override_settings(REST_FRAMEWORK=REST_FRAMEWORK)
class TestUserVoteOnOwnQuestion(APITestCase):
    '''验证用户不能给自己发布的问题投票'''

    def setUp(self):
        super().setUp()
        # 保存原始节流配置
        self.original_throttle_classes = UserQuestionVoteView.throttle_classes
        # 临时清空节流类,完全禁用节流
        UserQuestionVoteView.throttle_classes = []

    def tearDown(self):
        # 测试结束后恢复原始配置,避免影响其他测试
        UserQuestionVoteView.throttle_classes = self.original_throttle_classes
        super().tearDown()

    # 你原来的测试代码保持不变
    @classmethod
    def setUpTestData(cls):
        cls.user1 = User.objects.create_user("Me", password="topsecretcode")
        cls.user1_account = UserAccount.objects.create(user=cls.user1)
        cls.tag = Tag.objects.create(name="Tag")
        cls.q = mock_questions_submitted[2]
        cls.q.update({'user_account': cls.user1_account})
        cls.question = Question(**cls.q)
        cls.question.save()
        cls.question.tags.add(cls.tag)

    def test_vote_on_own_posted_question(self):
        self.client.login(username="Me", password="topsecretcode")
        response = self.client.put(
            reverse("questions_api:vote", kwargs={'id': 1}),
            data={"vote": "upvote"}
        )
        self.assertEqual(response.status_code, 400)
        self.assertEquals(
            response.data['vote'],
            "Cannot vote on your own question"
        )

方案2:显式覆盖限流速率为极大值

不用修改视图属性,直接在配置里把对应限流规则的阈值拉到足够大,测试场景下永远不会触发:

@override_settings(REST_FRAMEWORK={
    'TEST_REQUEST_DEFAULT_FORMAT': 'json',
    'DEFAULT_THROTTLE_RATES': {
        'voting': '1000000/minute' # 阈值远大于全量测试的请求数
    }
})
class TestUserVoteOnOwnQuestion(APITestCase):
    # 测试代码保持不变

方案3:全局测试环境禁用节流

如果所有测试都不需要触发节流,直接在测试专用的配置文件(比如 test_settings.py)中修改全局 DRF 配置:

REST_FRAMEWORK = {
    'TEST_REQUEST_DEFAULT_FORMAT': 'json',
    # 清空所有限流规则,或者单独把需要的阈值拉满
    'DEFAULT_THROTTLE_RATES': {}
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 05:36:07