0
点赞
收藏
分享

微信扫一扫

django中间件

一ke大白菜 2022-02-19 阅读 70

中间件定义

定义:中间件是Django请求、响应处理的钩子框架。轻量、低级“插件”系统,用于全局改变Django的输入(请求)输出(响应)。
django中间件以类的方式出现

中间件实现

中间件类须继承自django.utils.deprecation.MiddlewareMixin
中间件类须实现下列五个方法中的一个或多个:

  • 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时表示忽略当前操作进入下一项时间,当返回HttpResponse对象时表示此请求结束,直接返回给客户端

实现过程

1.在项目文件夹(根)创建一个文件夹middleware(包)
在这里插入图片描述

2.在middleware包中创建一个自定义的类,名称可以自定义
mymiddleware.py

from django.utils.deprecation import MiddlewareMixin

# 必须继承于from django.utils.deprecation import MiddlewareMixin
class MyMw(MiddlewareMixin):
    # 方法名称固定,不可自定义
    def process_request(self,request):
        print('process_request_mid_do___')

    def process_view(self,request,callback,callback_args,callback_kwargs):
        print('process_view_mid_do___')

    def process_response(self,request,response):
        print('process_response_mid_do___')
        return response

3.注册自定义中间件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',
    'middelware.mymidware.MyMw',
]

4.做测试视图、路由
视图

from django.http import HttpResponse
def test_middleware(request):
    return HttpResponse('中间件测试相应')

路由

urlpatterns = [
    path('test_middleware',views.test_middleware), # 中间件测试
]

响应效果
在这里插入图片描述
案例
用中间件实现强制某个IP只能向/test开头的地址发送5次请求
提示:
request.META[‘REMOTE_ADDR’]可以得到远程客户端的IP地址
request.path_info可以得到客户端访问请求路由的信息

class LimitRequest(MiddlewareMixin):
    # 临时测试,用一个字典来存放访问次数
    visit_times = {}
    def process_request(self,request):
        # 获取访问这IP
        visitor_ip = request.META['REMOTE_ADDR']
        # 获取请求路径
        request_info = request.path_info
        # 如果请求路径不是以test开头的就不管
        if not re.match('^/test',request_info):
            return
        # 获取访问次数,如果没有记录,初始值为0
        times = self.visit_times.get(visitor_ip,0)
        print('ip',visitor_ip,'已经访问',times)
        # 记录访问次数加1
        self.visit_times[visitor_ip] = times + 1
        if times < 5:
            return
        return HttpResponse('已经访问过'+str(times)+'次,拒绝访问')

举报

相关推荐

0 条评论