python自动化运维学习第二十八天--Django中间件
Django的中间件就是一个类。在项目settings模块中定义的变量MIDDLEWARE,其中的每一个元素都是一个中间件。
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',
]
MIDDLEWARE变量是个list,是有序的,所以其中的元素是依次执行的,自定义的中间件添加到最后。
前面说到Django接收到请求后首先经过urls,再到views,其实在urls前还要执行一些操作,那就是中间件。Django接收到请求后,依次执行MIDDLEWARE中的类。
中间件中可以定义四个方法,分别是:
- process_request(self,request)
- process_view(self, request, callback, callback_args, callback_kwargs)
- process_template_response(self,request,response)
- process_exception(self, request, exception)
- process_response(self, request, response)
以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。
中间件可以应用到登录验证、防火墙等相关场景。如自定义一个中间件,在中间件的request方法中定义一个白名单,存放不需要验证的页面url(如登录页面、注册页面等),在访问这些页面时就不需要验证登录信息。
自定义中间件
自定义一个中间件,实现登录验证的功能。
在项目中创建一个名字为md的包,在md包中创建一个mdw1.py文件
from django.shortcuts import render,HttpResponse,redirect
white_li = ["/index/","/login/"] #定义白名单list
class MiddlewareMixin(object): #django1.11后需要自己写这个类
def __init__(self, get_response=None):
self.get_response = get_response
super(MiddlewareMixin, self).__init__()
def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response
class MiddleWareDome(MiddlewareMixin): #自定义的中间件,继承上边写的类
def process_request(self, request): #接受请求
if not request.META.get('PATH_INFO') in white_li: #请求的url不在白名单中
if not request.session.get('login'): #没有登录session信息
return redirect('/index') #跳转到index
还要在settings的MIDDLEWARE中添加该中间件
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',
'md.mdw1.MiddleWareDome', #添加的自定义中间件
]
这样就可以把登录验证的功能放到中间件中,无论后端有多少页面,只要设置好白名单即可。