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

Django中如何在urlpatterns前处理请求、拦截IP及统计分析

解决Django请求全局IP校验与全量请求统计的方案

这问题其实用Django的中间件就能完美解决——毕竟中间件就是专门用来在请求到达路由/视图前后做全局处理的,刚好能覆盖你要的「所有请求(包括无效路径)都先处理」的需求。我给你一步步拆解实现:

核心思路:用自定义中间件拦截所有请求

Django的请求处理流程里,中间件是在URL路由匹配之前执行的,不管请求的路径是否存在,都会先经过中间件的逻辑。所以我们可以在这里完成两个核心需求:IP校验拦截,以及触发请求统计分析。

步骤1:创建自定义中间件

在你的项目(比如核心appcore)下新建middleware.py文件,编写中间件类:

from django.http import HttpResponseBadRequest
from .statistic import analyze_request

class RequestProcessingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # 这里配置允许的IP列表,也可以从配置文件/数据库动态读取
        self.allowed_ips = ["127.0.0.1", "192.168.1.100"]  # 替换成你的合法IP

    def __call__(self, request):
        # 1. 获取客户端真实IP
        # 基础场景:直接取REMOTE_ADDR
        client_ip = request.META.get("REMOTE_ADDR")
        # 如果部署在反向代理(Nginx/Apache)后,需要读取代理传递的真实IP
        # 注意:要先在代理服务器配置中开启传递真实IP,避免伪造头
        # client_ip = request.META.get("HTTP_X_FORWARDED_FOR", "").split(",")[0].strip() or request.META.get("REMOTE_ADDR")

        # 2. IP校验:不符合则直接返回400
        if client_ip not in self.allowed_ips:
            return HttpResponseBadRequest("Invalid IP Address")

        # 3. 触发请求统计分析
        # 注意:如果分析逻辑耗时,建议用异步任务(如Celery)避免阻塞请求
        analyze_request(request)

        # 继续执行后续请求流程(路由匹配、视图处理等)
        response = self.get_response(request)
        return response

步骤2:编写请求统计逻辑statistic.py

在同一目录下新建statistic.py,实现对请求Cookie、META等信息的分析:

def analyze_request(request):
    # 提取需要的请求数据
    client_ip = request.META.get("REMOTE_ADDR")
    cookies = request.COOKIES
    # 过滤META字段,只保留你需要的部分(比如去掉冗余的HTTP头)
    filtered_meta = {
        key: value
        for key, value in request.META.items()
        if key in ["REMOTE_ADDR", "HTTP_USER_AGENT", "REQUEST_METHOD", "PATH_INFO"]
    }

    # 这里写你的分析逻辑:写入日志、存入数据库、发送到分析平台等
    print(f"[统计] 请求来自IP: {client_ip}")
    print(f"[统计] 请求Cookie: {cookies}")
    print(f"[统计] 请求元数据: {filtered_meta}")

步骤3:注册中间件到项目配置

打开项目根目录的settings.py,找到MIDDLEWARE列表,把你的自定义中间件添加到靠前的位置(确保它在其他业务中间件之前执行):

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    # 添加你的自定义中间件
    "core.middleware.RequestProcessingMiddleware",  # 替换成你的中间件实际路径
]

关键细节补充

  • 无效路径的处理:因为中间件在URL路由匹配前执行,所以像http://mywebsite.com/blablabla这类不存在的路径,也会先经过IP校验和统计逻辑,完全符合你的需求。
  • 异步优化统计逻辑:如果analyze_request涉及IO操作(比如写数据库、调用外部API),直接同步执行会阻塞请求响应。这时候可以用Celery把分析任务异步化,中间件里只发送任务不等待执行。
  • IP获取的安全性:如果用HTTP_X_FORWARDED_FOR,一定要在反向代理服务器(如Nginx)中配置只信任来自代理的头,防止客户端伪造IP。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:18:15