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
相关产品推荐
相关产品推荐

