Django 4如何实现RESTful API动态限流_Python配合DRF内置Throttle组件控制频率

梦瑶酱_8314

梦瑶酱_8314

2026-04-13

998人浏览

原创

DRF的SimpleRateThrottle必须重写get_cache_key才能生效,因其默认仅对匿名用户限流;需返回非None字符串作为缓存键,且scope须与DEFAULT_THROTTLE_RATES中的键名一致,配合Redis缓存方可稳定生效。

django 4如何实现restful api动态限流_python配合drf内置throttle组件控制频率

DRF的SimpleRateThrottle必须重写get_cache_key才能生效

很多人配了DEFAULT_THROTTLE_RATES却没效果,根本原因是DRF默认只对匿名用户限流。只要用户已登录,AnonRateThrottle就完全不触发,而UserRateThrottle又默认按user.id限流——但你往往想按API路径、视图类甚至查询参数动态区分规则。

真正起作用的是继承SimpleRateThrottle并重写get_cache_key:它返回None表示不限流,返回字符串则作为缓存键参与计数。比如按URL路径+用户ID组合限流:

class PathUserThrottle(SimpleRateThrottle):
    scope = 'path_user'
<pre class="brush:php;toolbar:false;">def get_cache_key(self, request, view):
    if not request.user.is_authenticated:
        return None  # 匿名用户走另一套规则
    return f'user_{request.user.id}_{request.path_info}'

注意:scope必须和DEFAULT_THROTTLE_RATES里的键名一致,否则配置不加载。

如何在不同视图中启用不同限流策略

DRF不支持在settings.py里为每个视图单独配rate,得靠视图层显式声明。最灵活的方式是用throttle_classes属性,而不是全局配置。

  • APIView或GenericAPIView子类:直接设throttle_classes = [PathUserThrottle]
  • ViewSet:可在类属性设,也可在具体action方法上用@action(throttle_classes=[...])
  • 需要临时关闭限流?返回None从get_cache_key即可,比注释代码更可控

别把所有视图都塞进同一个scope,否则修改速率要重启服务;拆成细粒度scope(如'login'、'search'),再在settings.py里分别配DEFAULT_THROTTLE_RATES = {'login': '5/min', 'search': '20/hour'}。

Django 4下Redis缓存后端是限流稳定性的关键

DRF的SimpleRateThrottle底层依赖Django的cache,而Django 4默认的LocMemCache在多进程部署(如gunicorn多worker)时完全失效——每个worker维护独立内存缓存,限流形同虚设。

Django Wrap
Django Wrap

强戈环形山: q15040409-刻画家功能概述强戈环形山: q15040409-刻画家是一项面向实际任务的技能,主要用于平顶山: 维西翁: 1:1.0. 塔格斯: rap.github: 自动化。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该

下载

必须改用Redis:

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient'},
    }
}

同时确认已安装django-redis,且INSTALLED_APPS包含django_redis。漏掉任一环节,throttle会静默退化为不生效,连错误日志都不抛。

调试限流失败时优先检查get_cache_key返回值和缓存命中

限流没反应,90%情况是get_cache_key返回了None或空字符串。加一行日志验证:

def get_cache_key(self, request, view):
    key = f'user_{request.user.id}_{request.path_info}'
    print(f'[Throttle] cache key: {key}')  # 仅开发环境用
    return key

生产环境建议用logging.debug并确保日志级别够低。另外,用redis-cli手动查键是否存在:

redis-cli -n 1 keys "throttle_*"

如果完全查不到,说明缓存没写入——大概率是缓存配置未生效,或者cache.set被异常中断(比如Redis连接超时但没报错)。

动态限流真正的复杂点不在写法,而在“什么时候该放行、什么时候该拦截”的业务判断。比如搜索接口要对高频关键词限流,就得在get_cache_key里解析request.GET.get('q'),还要考虑空值、编码、SQL注入风险——这些逻辑一旦写错,限流就变成漏洞。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python django restful api

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1851

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5004

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

30057

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3587

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3587

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1243

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2783

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习