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/