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/  

 

 

posted @ 2024-07-09 22:33  little小新  阅读(20)  评论(0编辑  收藏  举报