码迷,mamicode.com
首页 > 其他好文 > 详细

Django之中间件

时间:2018-05-06 22:25:59      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:?Django项目 中间件

一、中间件介绍

1、介绍

中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。

2、注意:

  对于所有请求的批量做处理的时候用中间件

  单独对某几个函数做处理的时候用装饰器

3、流程

当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。

4、流程图

技术分享图片

Django项目请求数据:

            用户请求------>wsgiref解析数据------>中间件process_request方法  ------>urls  ------>views视图------>db和模板

Django项目响应数据:

            views渲染------>urls------> 中间件process_response 方法------>wsgiref封装数据  ------>用户

二、使用步骤

1、先建一个文件夹,里面写一个py文件

2、然后开始写类

(1)中间件就是一个类,类里面写几个方法

class M1(MiddlewareMixin):                #必须继承

    def process_request(self, request):    #request: 请求里面的所有的东西
        print("m1.request_request")
        #这个方法里面别轻易返回值,要是有返回值就不再继续执行后面的了,执行自己的process_response和上边的response
       # 一般是无返回值的:继续执行后续的中间件和视图函数
    def process_response(self, request, response):
        return response


(2)在settings中的MIDDLEWARE加上路径

    文件夹名称.py文件名称.类名

(3)找到继承的那个类,吧那个类拿过来

    一般不要用导入的方法,不然有时候更新了就没有这个类了,你就把它继承的那个类拿过来,


三、自定义中间件示例

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',
    "app01.utils.mymiddlewares.M1",                #添加自定义的M1
    "app01.utils.mymiddlewares.M2"                 #添加自定义的M2
]

在app01目录下创建utils目录,utils目录下创建mymiddlewares.py文件:

mymiddlewares.py文件内容:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class M1(MiddlewareMixin):                  #必须继承MiddlewareMixin
    def process_request(self,request):
        print("M1 process_request")
        # if 1:
        #     return HttpResponse("IP禁止")          #自定义规则,可以实现禁掉不安全的ip地址
        # 如果无返回值,就继续执行后续中间件和视图函数
        # 如果有返回值,就执行自己的process_response和上面的response
    def process_response(self, request,response):
        print("M1 process_response")
        return response
        
class M2(MiddlewareMixin):
    def process_request(self, request):
        print("M2 process_request")
    def process_response(self, request,response):
        print("M2 process_response")
        return response                      #页面显示index
        # return HttpResponse("123")           #如果替换掉本该返回的response,那最后看到页面显示的就是123


views.py文件内容:

from django.shortcuts import render,HttpResponse
def index(request):
    print("index....")
    return HttpResponse("index")

执行顺序如下:

技术分享图片




Django之中间件

标签:?Django项目 中间件

原文地址:http://blog.51cto.com/qidian510/2113330

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!