在 Django 开发中中间件是请求、响应流程的「全局拦截器」FBV/CBV是两种核心视图写法。本文带你从零实现自定义日志中间件兼容函数视图和类视图同时清晰对比两种视图的使用场景轻松掌握非侵入式的请求增强能力一、实验核心目标1. 学会在 Django 中自定义中间件掌握请求 / 响应全流程拦截2. 理清中间件执行顺序实现请求日志、视图埋点、异常捕获3. 对比 FBV函数视图和 CBV类视图写法理解适用场景4. 最终效果访问任意接口控制台自动打印请求路径、方法、视图名、响应状态码、异常信息二、Django 中间件全局请求「拦截器」1. 核心概念Django 中间件是介于浏览器请求和视图函数之间的钩子层请求会先经过中间件响应会再经过中间件返回浏览器不修改业务代码就能实现全局功能增强。2. 经典应用场景统一请求日志记录用户登录校验、IP 黑名单拦截全局异常处理响应头统一配置接口访问埋点统计思想类比和 SpringBoot 的拦截器、AOP 完全一致都是非侵入式的功能扩展3. 完整执行流程浏览器发送请求 ↓ process_request请求进入视图前 ↓ process_view视图执行前 ↓ 执行 FBV/CBV 视图 ↓ 视图报错 → process_exception异常捕获 ↓ process_response响应返回前 ↓ 浏览器接收响应4. 核心方法说明方法执行时机核心作用process_request请求刚进入获取请求方法、路径做基础校验process_view视图执行前获取视图名称、参数埋点日志process_exception视图报错时捕获全局异常打印错误信息process_response响应返回前修改响应头、记录状态码三、实战第一步自定义日志中间件1. 创建中间件文件在你的 Django 应用目录下新建middleware.py文件编写兼容 FBV/CBV 的日志中间件运行# 你的应用名/middleware.py from django.utils.deprecation import MiddlewareMixin class SimpleLogMiddleware(MiddlewareMixin): 自定义日志中间件 1. 记录请求入口信息 2. 打印即将执行的视图兼容FBV/CBV 3. 捕获视图全局异常 4. 记录响应状态码 自定义响应头 def process_request(self, request): 请求进入视图前执行 print(f\n[中间件] 请求进入{request.method} {request.path_info}) def process_view(self, request, view_func, view_args, view_kwargs): 视图执行前执行核心兼容FBV和CBV获取真实视图名 # 兼容CBV获取类视图的类名 view_class getattr(view_func, view_class, None) view_name view_class.__name__ if view_class else view_func.__name__ print(f[中间件] 即将执行视图{view_name}) print(f[中间件] 视图参数args{view_args}, kwargs{view_kwargs}) print(f[中间件] 请求详情path{request.path_info}, method{request.method}) def process_exception(self, request, exception): 视图执行报错时自动触发 print(f[中间件] 视图异常{exception}) def process_response(self, request, response): 响应返回浏览器前执行 print(f[中间件] 响应返回状态码{response.status_code}) # 自定义响应头标记中间件已生效 response[X-Request-Log] enabled return response✅关键技巧process_view中通过view_class兼容 CBV避免类视图只显示view而无法识别真实类名2. 注册中间件核心步骤打开项目settings.py在MIDDLEWARE列表末尾注册自定义中间件运行# settings.py 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, # 格式应用名.middleware.中间件类名 你的应用名.middleware.SimpleLogMiddleware, ]注意中间件顺序决定执行优先级请求从上到下执行响应从下到上执行。四、实战第二步编写 FBV CBV 视图我们同时实现两种视图测试中间件的兼容性。1. FBV 函数视图Function Based View适合简单业务代码直接易懂运行# 你的应用名/views.py from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt csrf_exempt # 忽略CSRF校验方便测试 def login_fbv(request): FBV登录视图手动判断请求方法 if request.method GET: return HttpResponse(GET 请求 - FBV 视图) if request.method POST: # 获取表单参数 username request.POST.get(user) password request.POST.get(pwd) # 简单校验 if username admin and password 123456: return HttpResponse(登录成功 - FBV 视图) return HttpResponse(登录失败 - FBV 视图) # 不支持的请求方法 return HttpResponse(仅支持GET/POST, status405)2. CBV 类视图Class Based View适合复杂业务按请求方法拆分逻辑结构清晰运行# 你的应用名/views.py from django.http import HttpResponse from django.views import View from django.views.decorators.csrf import csrf_exempt class LoginCBV(View): CBV登录视图自动匹配GET/POST方法 csrf_exempt def dispatch(self, request, *args, **kwargs): # 重写dispatch忽略CSRF校验 return super().dispatch(request, *args, **kwargs) def get(self, request): 自动处理GET请求 return HttpResponse(GET 请求 - CBV 视图) def post(self, request): 自动处理POST请求 username request.POST.get(user) password request.POST.get(pwd) if username admin and password 123456: return HttpResponse(登录成功 - CBV 视图) return HttpResponse(登录失败 - CBV 视图)五、实战第三步配置路由在应用的urls.py中配置两个测试接口CBV 必须调用as_view()转换为 Django 可识别的函数运行# 你的应用名/urls.py from django.urls import path from . import views urlpatterns [ # FBV 路由直接写函数名 path(login/fbv/, views.login_fbv, namelogin_fbv), # CBV 路由必须调用 as_view() path(login/cbv/, views.LoginCBV.as_view(), namelogin_cbv), ]六、运行项目 测试效果1. 启动 Django 服务运行# 检查项目配置 python manage.py check # 启动服务 python manage.py runserver2. 访问测试接口浏览器访问FBVhttp://127.0.0.1:8000/login/fbv/CBVhttp://127.0.0.1:8000/login/cbv/3. 控制台输出效果中间件生效[中间件] 请求进入GET /login/fbv/ [中间件] 即将执行视图login_fbv [中间件] 视图参数args(), kwargs{} [中间件] 请求详情path/login/fbv/, methodGET [中间件] 响应返回状态码200 [中间件] 请求进入GET /login/cbv/ [中间件] 即将执行视图LoginCBV [中间件] 视图参数args(), kwargs{} [中间件] 请求详情path/login/cbv/, methodGET [中间件] 响应返回状态码2004. 异常捕获测试在 FBV 视图中手动制造错误测试异常拦截运行csrf_exempt def login_fbv(request): 1 / 0 # 制造除零异常 # ... 原有代码刷新接口控制台自动打印异常[中间件] 视图异常division by zero测试完成后删除错误代码即可七、FBV vs CBV 终极对比对比维度FBV 函数视图CBV 类视图全称Function Based ViewClass Based View编写方式普通函数继承 View 的类请求处理手动判断request.method自动匹配get()/post()代码结构简洁直接代码集中结构清晰按方法拆分扩展性弱复杂业务易臃肿强支持继承 / 重写路由写法views.login_fbvviews.LoginCBV.as_view()适用场景简单接口、小功能页面复杂业务、需要复用逻辑开发建议小功能用 FBV 快速开发复杂业务用 CBV 规范代码八、实验总结1. 中间件核心价值非侵入式实现全局功能无需修改每个视图就能统一记录日志、捕获异常。2. 执行顺序process_request→process_view→ 视图 →process_exception异常→process_response。3. 兼容技巧process_view中通过view_class兼容 CBV 视图精准获取视图名称。4. 视图选择简单业务 FBV 首选复杂业务 CBV 更优。这套中间件 视图的组合是Django开发中全局日志、权限校验、异常处理的标准方案直接复用就能提升项目开发效率【附件】相关所有代码可点击下方链接见详情django-middleware-fbv-cbv-demo: Django 自定义中间件实战实现请求日志、异常捕获同时对比 FBV 函数视图与 CBV 类视图的写法与执行流程。https://gitee.com/Zhang-Siyu0066/django-middleware-fbv-cbv-demo