【问题标题】:django limit the number of requests per minutedjango 限制每分钟的请求数
【发布时间】:2025-12-14 00:55:02
【问题描述】:

我正在尝试限制来自某个 IP 的请求数量,以防收到太多请求。

例如:如果我每分钟收到超过 50 个请求,我想阻止它 IP 5 分钟。

当我使用request.META['REMOTE_ADDR'] 时,我总是得到本地主机的 IP,而不是发送请求的主机。

  1. 如何获取发送请求的计算机的 IP?
  2. 如何限制该 IP 在 X 时间内不发送更多请求?

【问题讨论】:

标签: python django request


【解决方案1】:

django-ratelimit 将限制您在给定时间内收到的请求数量。

安装:

pip install django-ratelimit

在你看来:

from ratelimit.decorators import ratelimit

@ratelimit(key='ip', rate='10/m')
def myview(request):
...

【讨论】:

    【解决方案2】:

    1.如何获取发送请求的电脑IP?

    def get_client_ip(request):
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip
    
    >>>get_client_ip(request)
    "client ip"
    

    2.如何限制该 IP 在 X 时间内不发送更多请求?

    我认为你可以为这种类型设置一个middleware。比如在数据库中节省请求时间,将相邻请求与之前的请求进行比较等等。

    根据评论更新

    如果你使用 nginx 作为 web 服务器,试试这个 http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

    【讨论】:

    • 见@dyleri 的评论。没有冒犯,但如果 OP 想要限制每分钟的请求数,则可能不希望该 IP 与应用程序交互。但是,对于您不想处理的请求,您的建议将不可避免地对数据库造成严重影响,在我看来,这是不对的。
    • Q1 对吗? Q2,OP 没有提到 nginx 被用作网络服务器?
    • 您的 Q1 是和否,这可能不正确,因为 OP 未指定这是在哪个堆栈中,在许多情况下,例如在代理服务器后面等可能无法获取请求 IP。关于 dyleri 的评论,这个想法不是关于 Nginx 而是关于 webserver。即便如此,您也不能总是相信 django 标头来确定请求 IP。
    • @Anzel 我承认 OP 要求在 Django 中执行此操作,这就是为什么我在评论中回复,而不是答案。尽管如此,我相信“不要那样做”是要提供的正确信息。
    • @dylrei,我同意。这就是为什么我只在这个答案下发表评论,但即使整个事情都不正确也不投反对票,因为这确实是根据 OP 的要求回答的一种方式。