如何在Django Rest Framework中按时间限制特定接口的API请求?
Django指定POST接口15分钟限流实现方案
核心逻辑是接口侧做频率校验,同时通过标准HTTP规则引导客户端自动限制请求,不需要强行不返回响应,完全可以写在对应接口的post函数内部,新手也能快速落地:
- 第一步:做请求方的唯一标识
登录用户直接用用户ID作为标识,未登录的匿名用户可以用请求IP、设备唯一标识等作为唯一标识,用来区分不同请求方的访问记录。 - 第二步:存储上次请求时间
直接用Django自带的cache缓存模块存储每个标识的最近一次请求时间,不需要额外搭建服务,默认本地缓存可直接用,生产环境换成Redis缓存即可保证多实例部署的准确性。 - 第三步:频率校验+返回标准限流响应
校验当前请求和上次请求的间隔,不足15分钟时返回HTTP 429(请求过多)状态码,同时在响应头加Retry-After字段,值为剩余冷却秒数(15分钟=900秒)。这是HTTP标准规则,浏览器、各端的通用请求框架都会默认识别该字段,在冷却时间内不会再向该接口发起重复请求,完全满足你需要客户端侧自动限制请求的需求。 - 可选优化:如果你自己可控前端代码,可以在响应体里额外返回剩余冷却秒数,前端直接做提交按钮置灰、倒计时提示,用户无法主动点击提交,从源头避免无效请求发送。
最简代码示例
import time from django.http import JsonResponse from django.core.cache import cache # 你对应的视图类的post方法 def post(self, request, *args, **kwargs): # 生成请求方唯一标识 user_tag = request.user.id if request.user.is_authenticated else request.META.get('REMOTE_ADDR') cache_key = f"limit_my_api_{user_tag}" # 冷却时间15分钟=900秒 COOLDOWN_SECONDS = 900 # 读取上次请求时间 last_req_time = cache.get(cache_key) if last_req_time: remaining = COOLDOWN_SECONDS - (time.time() - last_req_time) if remaining > 0: # 返回限流响应,加标准Retry-After头 resp = JsonResponse( {"msg": "操作频繁,请稍后再试", "remaining_seconds": int(remaining)}, status=429 ) resp["Retry-After"] = int(remaining) return resp # 校验通过,先更新缓存里的请求时间 cache.set(cache_key, time.time(), timeout=COOLDOWN_SECONDS) # 此处写你原本的接口正常业务逻辑 # ...
内容的提问来源于stack exchange,提问作者BuZZZard
相关产品推荐
相关产品推荐

