中间件作用:
介入Django的请求和响应处理工程,并用于修改Django的输入输出增强Django框架的健壮性
如何使用中间件:
Django在中间件中预置了5个方法,不同的方法在不同的阶段执行,对输入输出进行干预
方法一:init()初始化方法 ,服务器第一个请求时调用一次,用于确定是否使用当前中间件
def __init__(self):
pass
方法二:处理请求前的process_request()方法,在每个请求上,request对象产生之后,url匹配之前调用,返回none或HttpResponse对象
def process_request(self,request):
pass
方法三:处理视图前的process_view()方法,每个请求上,url匹配之后,视图函数调用之前调用,返回None或HttpResponse对象
defprocess_view(self,request,view_func,*view_args,**view_kwargs):
pass
方法四:处理响应后的process_response()方法,视图函数调用之后,所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
def process_response(self,request,response):
pass
方法五:处理异常函数的process_exception()方法
def process_exception(self, request,exception):
pass
应用场景:
通过路由拦截对客户端进行页面访问限制,对于非法访问对访问IP进行封禁
使用优点: 只需要写一次即可,不需要每一次使用都特地调用
中间件是一个独立的python类,以上的五个方法不需要每一次使用都全部写上,需要那个写那个即可
封禁IP
创建一个测试中间件的项目,在项目test_middleware目录下创建testmiddleware.py文件,代码如下:
#命令行创建django项目:django-admin startproject test_middleware
from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse
# 把要封禁的IP放入一个列表中,通过请求获得访问的IP,如果请求的IP在封禁列表内,就对对该访问IP进行中断访问
forbiddenIps = ["127.0.0.1"]
class TestMiddleware(MiddlewareMixin):
def process_request(self,request):
ip = request.META.get("REMOTE_ADDR")
if ip in forbiddenIps:
return HttpResponse("你的IP已被禁封")
print("-----------process-request----------")
def process_view(self,request,view_func,*view_args,**view_kwargs):
print(request.META.get('REMOTE_ADDR'))
print("Middleware===========>process_view()")
def process_response(self,request,response):
print("-----------process-response----------")
return response
创建并编写好中间件文件后还需要对这个文件进行配置,需要在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',
'test_middleware.testmiddleware.TestMiddleware' # 注册中间件
]
紧接着就是一些常规的常规操作了
编写视图函数:
from django.http import HttpResponse
from django.shortcuts import render
def index(request):
return HttpResponse("ok")
配置路由
from django.conf.urls import url
from django.contrib import admin
from .views import *
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', index),
]
运行服务器并在页面上输入 http://127.0.0.1:8000/test/后刷新即可查看127.0.0.1这个IP访问页面被中断