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

 

posted @ 2017-10-04 19:20  张璨  阅读(115)  评论(0)    收藏  举报