You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:48:03