Loading

21.-中间件

一、中间件的定义
1.中间件是Django请求/响应处理的钩子框架,它是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入或输出
2.中间件以类的形式体现
3.每个中间件组件负责做一些特定的功能,例如Django包含一个中间件组件 AuthenticationMiddleware,它使用会话将用户与请求关联起来
 
 
二、中间件编写&注册
注册中间件
# 在项目路径下创建middleware(自定义名称)中间件文件夹
# settings.py  中需要注册一下自定义的中间件
MIDDLEWARE = [
    'middleware.py_name.calss_name',  #中间件文件夹/py文件/中间件类
]
# 配置为数组,中间件被调用时先以先上到下,再由下到上的顺序调用 / 进视图之前是从上到下,进视图之后是从下到上

 

编写中间件
# 中间件类必须继承自 
from  django.utils.deprecation import  MiddlewareMixin
class Middleware_Name(MiddlewareMixin):
    ...
# 中间件类必须实现下列五个方法中的一个或多个

  def process_request(self,request)  #执行路由之前被调用,在每个请求上调用,返回None或者HttpResponse对象
   
  def process_view(self,request,callback,acllback_args,acllback_kwargs)  #调用视图之前被调用,在每个请求上调用,返回None或者HttpResponse对象 
  
  def process_view(self,request,response) # 所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
  
  def process_exception(self,request,exception) #  当处理过程中抛出异常时调用,返回一个HttpResponse对象
  
 def process_template_response(self,request,response) #在视图函数执行完毕且视图返回的对象中包含render方法时被调用,该方法需要返回实现了render方法的响应对象
 
 # 中间件中的大多数方法在返回None时表示忽略当前操作进入下一事项,当返回HttpResponse对象时表示此请求结束,直接返回给客户端

 

 
 
实现示例
用中间件实现强制某个IP地址只能向/test开头的地址发送5次请求
request.META['REMOTE_ADDR'] #可以得到远程客户端的地址
request.path_info #可以得到客户的访问的路由信息

 

 
# 中间件类
class VisitLimit(MiddlewareMixin):
    # 定义字典记录访问次数
    visit_times = {}

    def process_request(self, request):
        # 获取访问者IP地址
        ip_address = request.META['REMOTE_ADDR']
        # 获取访问路由
        path_url = request.path_info
        # 如果是以/test地址开头,返回None,继续执行
        if not re.match('^/test', path_url):
            return
        # 存储ip地址访问次数
        times = self.visit_times.get(ip_address, 0)
        print('ip', ip_address, '已经访问', times)
        # 访问次数+1
        self.visit_times[ip_address] = times + 1
        # 判断访问次数
        if times < 5:
            return
        return HttpResponse('已经访问过' + str(times) + '次,访问被禁止')

 

 
三、Django请求流程图
 

posted @ 2022-01-12 12:27  木子七  阅读(35)  评论(0编辑  收藏  举报