22、Django-中间件-Middleware
1、中间件是Django请求/响应处理的钩子框架、他是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入或输出 2、中间件以类的形式体现 3、每个中间件组件负责做一些特定的功能、例如:Django包含一个中间件组件AuthentucationMiddleware、它使用会话将用户与请求关联起来 4、类似高速收费站、将一些流量或请求拦截符合要求的才能通过-这就是钩子函数
编写中间件
1、中间件类必须继承自django.utils.deprecation.MiddlewareMixin类 2、中间件类必须实现下列五个方法中的一个或多个: -- process_request(self, request) -- 执行路由之前被调用、在每个请求上调用、返回None或HttpResponse对象 -- process_view(self,request, callback, callback_args,callback_kwargs) -- 调用视图函数之前被调用、在每个请求上调用、返回None或HttpResponse对象 -- process_response(self, request, response) -- 所有响应返回浏览器被调用,在每个请求上调用,返回HttpResponse对象 -- process_exception(self, request, exception) -- 当处理过程中抛出异常时调用、返回一个HttpResponse对象 -- process_template_response(self, request, response) -- 在视图函数执行完毕且试图返回的对象中包含render的方法时被调用、该方法需要返回实现了render方法的响应对象 #注意:中间件中的大多数方法在返回None时标识忽略当前操作进入下一项事件、当返回HttpResponese对象时标识此请求结束、直接返回给客户端
使用中间件
在setting.py中需要注册一下自定义的中间件 #file:settings.py MIDDLEWARE = [ ......中间件.... ] #一般需要在项目的目录下(与app应用同级)创建一个middleware目录用于写中间件的代码
创建中间件:
1、创建中间件的py文件 mymiddleware.py -------------------------------------------------------------------------------------------- from django.utils.deprecation import MiddlewareMixin from django.utils.deprecation import MiddlewareMixin class MyMW(MiddlewareMixin): # MiddlewareMixin是Django提供的一个中间件的基类,它实现了__call__方法, # process_request:在路由之前执行 def process_request(self, request): print('MyMW process_request do--- 进到路由之前。。。') # process_view:在路由之后执行、也就是匹配路由之后执行 def process_view(self, request, callback, callback_args, callback_kwargs): print('MyMW process_view do--- 进到路由之后、视图函数之前。。。') def process_response(self, request, response): print('MyMW process_response do--- 响应返回之前。。。') return response # 必须返回response对象 class MyMW2(MiddlewareMixin): # MiddlewareMixin是Django提供的一个中间件的基类,它实现了__call__方法, # process_request:在路由之前执行 def process_request(self, request): print('MyMW2 process_request do--- 进到路由之前。。。') # process_view:在路由之后执行、也就是匹配路由之后执行 def process_view(self, request, callback, callback_args, callback_kwargs): print('MyMW2 process_view do--- 进到路由之后、视图函数之前。。。') def process_response(self, request, response): print('MyMW2 process_response do--- 响应返回之前2。。。') return response # 必须返回response对象 ---------------------------------------------------------------------------------------------- 2、到setting.py中的 MIDDLEWARE =[] 中去注册 ------------------------------------------------------------------------------------------ MIDDLEWARE = [ 。。。。。。。。。。 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'middleware.mymiddleware.MyMW', #注册中间件的类 'middleware.mymiddleware.MyMW2' ] -------------------------------------------------------------------------------------- 3、在视图函数中 views.py --------------------------------------------------------------------- from django.http import HttpResponse from django.shortcuts import render def test_view(request): print('test_view in 测试') return HttpResponse('test_view in 测试') ----------------------------------------------------------------------------------- 4、添加路由 urls.py ------------------------------------------------------------ from django.contrib import admin from django.urls import path from midware import views urlpatterns = [ path('admin/', admin.site.urls), path('test_view/' , views.test_view) ] ------------------------------------------------------------------ #访问:http://127.0.0.1:8000/test_view/ #注意:配置为数组、中间件被调用时、以‘先上到下’再‘由下到上’ 的顺序调用
练习:
在mymiddleware.py中添加 ---------------------------------------------------------------- import re class VisitLimit(MiddlewareMixin): visit_times = {} def process_request(self, request): ip_address = request.META['REMOTE_ADDR'] # 获取客户端的ip地址 path_url = request.path_info # 获取客户端请求的url地址 # 判断是否是访问test开头的url if not re.match('^/test', path_url): return # 获取key的值、判断是否是第一次访问 times = self.visit_times.get(ip_address, 0) #使用get当字典中不存在时这个值时、默认为0 print('ip', ip_address, '已经访问', times) # 访问次数+1 self.visit_times[ip_address] = times + 1 if times < 5: # 判断访问次数、访问次数小于5次、允许访问 return # 访问次数大于5次、不允许访问 return HttpResponse('访问次数过多' + str(times) + '次, 访问禁止') ------------------------------------------------------------------------------------------- 在setting.py中添加中间件 ------------------------------------------------------------ MIDDLEWARE = [ 。。。。。。。。 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'middleware.mymiddleware.MyMW', 'middleware.mymiddleware.MyMW2', 'middleware.mymiddleware.VisitLimit', ] ----------------------------------------------------------------- #访问:http://127.0.0.1:8000/test_view/
本文作者:little小新
本文链接:https://www.cnblogs.com/littlecc/p/18190283
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步