1. 中间件是谁?它像你家小区的保安大爷!
如果你把Django项目想象成一个热闹的居民小区,那中间件就是门口那位眼神犀利的保安大爷。每个进出小区的居民(HTTP请求/响应)都得经过他的审视:快递小哥想进门?先登记(权限验证);邻居家狗半夜狂吠?直接拦下(异常拦截)!而激活中间件,就是给保安大爷发上岗证的过程——没这张证,他只能在岗亭里喝茶摸鱼。
很多新手会懵:“我明明写了中间件类,为啥死活不生效?” 别急,八成是你忘了在settings.py里喊一嗓子:“大爷,该上班了!”
2. 解剖中间件:它的五脏六腑长这样
一个标准的中间件类,其实是个“五边形战士”:
class MyMiddleware:
def __init__(self, get_response):
self.get_response = get_response # 接班人的联系方式
def __call__(self, request):
# 请求进门:查健康码、测体温
print("保安大爷:请求来了!路径是", request.path)
response = self.get_response(request) # 放行到下一关
# 响应出门:贴小广告、塞传单
response['X-My-Header'] = 'Hello from Middleware!'
return response
但注意!光写类不算数,就像造了汽车不加油——你得把它塞进Django的“工作流水线”。
3. 激活密码藏在这里!settings.py的MIDDLEWARE数组
打开你的settings.py,找到那个叫MIDDLEWARE的列表:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# ... 其他默认中间件
'myapp.middleware.MyMiddleware', # 🚨 你的定制中间件!
]
三条黄金法则:
- 路径要对:如果中间件在
myapp/middleware.py里,就写'myapp.middleware.MyMiddleware' - 顺序很重要:从上到下执行请求,从下到上执行响应(像洋葱包裹)
- 别手抖:少个逗号?整个项目直接表演原地爆炸!
4. 实战:做一个“请求测速器”中间件
我们来写个会计时的保安大爷,统计每个请求的处理时长:
步骤1:创建中间件
在myapp/middleware.py中写:
import time
class TimingMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
start_time = time.time()
response = self.get_response(request)
duration = time.time() - start_time
print(f"🕒 请求 {request.path} 耗时 {duration:.2f} 秒")
response['X-Response-Time'] = str(duration)
return response
步骤2:激活中间件
在settings.py的MIDDLEWARE里加一行:
MIDDLEWARE = [
# ...
'myapp.middleware.TimingMiddleware',
]
步骤3:立刻体验效果!
启动服务器后访问任意页面,控制台会打印:
🕒 请求 /admin/ 耗时 0.15 秒
🕒 请求 /api/data/ 耗时 2.33 秒
同时浏览器检查Network标签,会发现响应头里多了个X-Response-Time!
5. 避坑指南:中间件的那些骚操作
- 异常处理:在
__call__里用try/except抓异常,给错误请求返回定制页面 - 请求篡改:给
request对象动态添加属性(比如request.user_id = 123) - 响应美容:给所有HTML响应自动追加页脚(考验你的字符串替换技巧)
但切记:别在中间件里干重活!否则它会成为全站的流量瓶颈。
6. 进阶玩法:中间件能有多离谱?
- UA探测器:识别微信浏览器自动跳转H5页面
- 地理封锁:根据IP直接拦截某些地区的请求
- 动态维护模式:检测到数据库迁移时,返回“系统维护中”页面
甚至有人用中间件实现API调用次数统计,替代部分轮子工具!
7. 总结:中间件是你的隐形瑞士军刀
记住:写中间件 ≈ 造工具,激活中间件 ≈ 把工具塞进工程师的腰带。当你学会精准控制中间件的激活时机和顺序,就仿佛拥有了调节Django项目血流速度的魔法。现在就去检查你的MIDDLEWARE列表吧——说不定有个摸鱼的“保安大爷”正等你的上岗通知呢!
彩蛋:如果你在MIDDLEWARE里配错了路径,Django会抛出一个ImportError并亲切提示:“哥们,你写的这个类我找不到啊!” —— 这种对话感,正是代码世界的浪漫所在✨
Django中间件激活指南

被折叠的 条评论
为什么被折叠?



