十五、django 中间件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25611295/article/details/85781989

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。
应用场景:登录验证,session验证
因为所有的流量都需要经过中间件,所以用中间件做登录验证是非常方便的
在django项目的settings模块中,有一个 MIDDLEWARE列表,其中每一个元素就是一个中间件,如下图。
在这里插入图片描述
中间件的运行流程:
1、客户端发出请求(httprequest)---->
2、首先会经过中间件,,如果是None,则继续按照django定义的规则向下执行如果是HttpResonse对象,则直接将该对象返回给用户 ---->
3、在执行view、modle等模块—>
4、返回httpresonse

自建中间件:

创建一md文件夹,写入py文件:

#!/usr/bin/python
# -*- coding:utf-8 -*-
# @Time   : 2019/1/4 11:18
# @Author : liaochao
# @File   : middleware.py

from django.shortcuts import render,HttpResponse,redirect
#白名单
white_li = ['/login']

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


class MiddlewareDemo1(MiddlewareMixin):
    def process_request(self, request):
        print('demo1_request')
    def process_response(self,request,response):
        print('demo1_response')
        return response

class MiddlewareDemo2(MiddlewareMixin):
    def process_request(self,request):
        print('demo2_request')
    def process_response(self,request,response):
        print('demo2_response')
        return response

此处demo1 和demo2写的就是中间件

注册中间件

注册中间件其实就是在setting文件中定义,格式为文件夹名+文件名+类名。如图:

在这里插入图片描述
我们在login模块中加入一行代码来测试中间件的运行流程:
加入:

print ('Login....')

在这里插入图片描述

此时访问我们的登录页面:
http://127.0.0.1:8080/login_demo
可以观察到控制台打印:
demo1_request
demo2_request
Login…
demo2_response
demo1_response

添加白名单,让某些页面不需要经过验证,

我们的login页面是不需要验证的,可能还有其他页面也不需要验证
我们可以根据session判断,带了sessionde 可以通过,没带的重定向到登录页面,
我们在中间件里面demo1类里面写入:

white_li = ['/login_demo']
class MiddlewareDemo1(MiddlewareMixin):
    def process_request(self, request):
        print('demo1_request')
        print('session-->',request.session.get('login'))
        if not request.META.get('PATH_INFO') in white_li:
            if not request.session.get('login'):
                print ("白名单验证。。")
                return redirect('/login_demo')
    def process_response(self,request,response):
        print('demo1_response')
        return response

此时访问:
http://127.0.0.1:8080/index_demo,自动跳转到http://127.0.0.1:8080/login_demo
控制台输出:
demo1_request
session–> None
白名单验证。。
demo1_response
[04/Jan/2019 15:54:04] “GET /login_demo HTTP/1.1” 302 0

直接访问:http://127.0.0.1:8080/login_demo
控制台输出:
demo1_request
session–> None
demo2_request
Login…
demo2_response
demo1_response
[04/Jan/2019 15:56:04] “GET /login_demo HTTP/1.1” 200 471

猜你喜欢

转载自blog.csdn.net/qq_25611295/article/details/85781989