任务一验证中间件的4个【钩子】函数一、创建一个Django项目和应用在终端中执行以下命令创建一个项目和应用。django-admin startproject myproject cd myproject python manage.py startapp myapp二、编写自定义中间件在myapp目录下创建一个名为middleware.py的文件并输入以下代码。此中间件在每一步都打印信息直观展示执行流程。# myapp/middleware.py from django.utils.deprecation import MiddlewareMixin from django.http import HttpResponse class MyMiddleware(MiddlewareMixin): 自定义中间件用于演示钩子的执行顺序 def process_request(self, request): print(1. [MyMiddleware] process_request 被执行) return None # 返回None继续处理 def process_view(self, request, view_func, view_args, view_kwargs): print(f2. [MyMiddleware] process_view 即将调用视图: {view_func.__name__}) return None # 返回None继续处理 def process_exception(self, request, exception): print(f3. [MyMiddleware] process_exception 捕获到异常: {exception}) # 返回None则继续抛出原异常返回HttpResponse则处理此异常 return None def process_response(self, request, response): print(4. [MyMiddleware] process_response 被执行准备返回响应) return response # 必须返回response对象三、注册中间件为了让Django“认识”这个中间件需要在myproject/settings.py文件的MIDDLEWARE列表中进行注册。注意顺序影响执行流程通常放在末尾即可。# myproject/settings.py MIDDLEWARE [ ... myapp.middleware.MyMiddleware, # 注册我们的中间件 ]四、创建用于测试的视图在myapp/views.py中创建一个简单的视图函数用于发起请求并可选地制造一个异常来测试process_exception。# myapp/views.py from django.http import HttpResponse def normal_view(request): print( 视图函数 normal_view 正在执行) return HttpResponse(这是一个正常的请求响应。) def error_view(request): print( 视图函数 error_view 正在执行) raise ValueError(视图函数里故意抛出的异常)五、配置URL路由在myproject/urls.py中配置路由将URL请求映射到我们刚创建的视图。# myproject/urls.py from django.contrib import admin from django.urls import path from myapp.views import normal_view, error_view urlpatterns [ path(normal/, normal_view, namenormal_view), path(error/, error_view, nameerror_view), path(admin/, admin.site.urls), ]六、运行并观察结果在项目根目录下启动Django开发服务器。验证正常流程打开浏览器访问http://127.0.0.1:8000/normal/关注终端控制台的输出可以看到钩子函数的执行顺序。验证异常流程接着访问http://127.0.0.1:8000/error/观察输出变化。验证返回HttpResponse的效果修改process_request方法让它在特定条件下返回一个HttpResponse对象可以观察到视图函数normal_view将不再被执行。# 在 process_request 方法中添加 if request.path /block/: return HttpResponse(请求被中间件拦截视图函数未执行。) return None任务二验证CBV和FBV做比较一、编写FBV视图在myapp/views.py中增加一个FBV示例。# myapp/views.py from django.http import HttpResponse def fbv_demo(request): if request.method GET: return HttpResponse(这是一个FBV视图处理GET请求。) elif request.method POST: # 假设这里有处理POST的逻辑 return HttpResponse(这是一个FBV视图处理POST请求。) else: return HttpResponse(status405) # 方法不被允许二、编写CBV视图在同一个views.py文件中编写一个相应的CBV示例。# myapp/views.py from django.views import View class CbvDemo(View): def get(self, request): return HttpResponse(这是一个CBV类视图处理GET请求。) def post(self, request): # 假设这里有处理POST的逻辑 return HttpResponse(这是一个CBV类视图处理POST请求。)三、配置URL路由# myproject/urls.py from django.contrib import admin from django.urls import path from myapp.views import normal_view, error_view, fbv_demo, CbvDemo urlpatterns [ # FBV的路由直接写函数名即可 path(fbv/, fbv_demo, namefbv_demo), # CBV的路由需要使用.as_view()方法 path(cbv/, CbvDemo.as_view(), namecbv_demo), # 之前的测试路由 path(normal/, normal_view, namenormal_view), path(error/, error_view, nameerror_view), path(admin/, admin.site.urls), ]四、验证结果启动开发服务器后使用浏览器访问或通过命令行工具测试。访问FBV视图在浏览器中打开http://127.0.0.1:8000/fbv/页面显示“这是一个FBV视图处理GET请求。”访问CBV视图在浏览器中打开http://127.0.0.1:8000/cbv/页面显示“这是一个CBV类视图处理GET请求。”初步对比代码层面CBV通过get、post方法清晰地分离了不同请求的处理逻辑无需手动判断request.method结构更清晰。在路由层面CBV必须使用as_view()方法这其实是Django背后一个巧妙的设计它将类转换为一个视图函数供URL调用。