django中间件
#! /usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "Ellis" # Date: 2017/9/18 ''' 自己写一个中间件 ''' from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse,render,redirect#如果要自己写返回值,也应该是这个形式 class M1(MiddlewareMixin): def process_request(self,request): print('m1.process_request')#不需要返回值,如果有返回值,就不会执行下面的中间件 # return HttpResponse("gunbani")#可以维护一个黑名单,如果ip在黑名单中,就给他return一个“滚” # 还可以做用户验证 if request.path_info == '/login.html': return None #这个是不需要用户验证的视图 if not request.session.get('user_info'):#用到session,需要把这个中间件放到后面,至少是session后面 return redirect('/login.html')#如果session中没有验证,就跳转到登录页面 def process_view(self,request,view_func,view_func_args,view_func_kwargs): print('m1.process_view') # return HttpResponse("process_viewvvvvvvvvvvv")#如果这有返回值,就替换了response,中间件走到这,就直接去了response def process_exception(self,request,exception): print("m1.process_exception")#程序出错的时候才会执行,注意错误要写到函数里,不要一上来就直接出错了,那样项目直接启动不起来了 return HttpResponse("恭喜你发现一个bug,你成功将这个程序员送上了天")#也是会替换掉response def process_response(self,request,response): print('m1.process_response') # return HttpResponse("asddsag")#要有返回值,如果是自己随便写的返回值,那返回值就被自己写的替换掉了 return response def process_template_response(self,request,response): print("M1.process_template_response") return response#这个是在视图函数中有render方法时才会执行
settings:
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_diy.middleware.M1'#自己写的中间件, ]
views:
随便写一个就行
重点在执行顺序:

整体流程:

注,新版本的django可能对于这条命令不支持:
from django.utils.deprecation import MiddlewareMixin
如果出现这个问题,那就要自己重写一下这个MiddlewareMixin
class MiddlewareMixin(object): 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

浙公网安备 33010602011771号