• Django之 中间件


    中间件 

    介绍

    中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。django中自带如下7个中间件,在setting配置可见,如下:

    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',
    
    ]

    概念

    中间件是一个类(类里面可以定义方法)

    方法(待补充):

    proces_request(返回值可有可无),process_response(必须设置返回值:response)

    定义

    以后想要对所有的请求做统一操作时,用中间件。

    只是对少量的视图函数做操作时,用装饰器。

    Django的请求生命周期

    自定义django中间件

      除了django自带如上7种中间件,我们为了满足自己的需求,也可自定义中间件,中间件就是定义一个类,类的下面有四个方法,分别为process_request、process_view、process_exception及process_response,但此类必须但是必须继承MiddlewareMixin,引入方式如下:django.utils.deprecation import MiddlewareMixin。

      自定义中间件实例如下,中间件.py文件必须放在django项目的根目录下,中间件的配置方式与自带中间件配置方式一致。如下实例:

    中间件执行顺序

    中间件被执行的顺序

      如上,中间件的执行顺序是按照如上中间件配置顺序执行的,从上到下,依次执行中间件中的process_request函数,然后根据url执行所有views视图函数,视图函数执行完后,再从后依次往前执行process_response函数。

      但是需要注意,如下为请求的视图函数和自定义的中间件:

    views函数:

    def index(request):
        print("view函数...")
        return HttpResponse("OK")

    中间件:

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    class Md1(MiddlewareMixin):
    
        def process_request(self,request):
            print("Md1请求")
            #return HttpResponse("Md1中断")
        def process_response(self,request,response):
            print("Md1返回")
            return response
    
    class Md2(MiddlewareMixin):
    
        def process_request(self,request):
            print("Md2请求")
        def process_response(self,request,response):
            print("Md2返回")
            return response

    此时输出结果顺序为:

    Md1请求
    Md2请求
    视图函数
    Md2返回
    Md1返回

     SessionMiddleware

    class Md3(SessionMiddleware):
        def process_request(self, request):
            print("Md3请求")
    
        def process_response(self, request, response):
            print("Md3返回")
            return response
    
    
    class Md4(SessionMiddleware):
        def process_request(self, response):
            print("Md4请求")
    
    
        def process_response(self, request, response):
            print("Md4返回")
            return response
  • 相关阅读:
    uva10341
    android_定义多个Activity及跳转
    阿里巴巴2014年校园招聘(秋季招聘)在线笔试--測试研发project师
    关于程序猿的几个阶段!
    【Spring】Spring学习笔记-01-入门级实例
    感知器算法(二分类问题)
    Ubuntu14.04下安装ZendStudio10.6.1+SVN出现Failed to load JavaHL Library
    EF架构~关系表插入应该写在事务里,但不应该是分布式事务
    EF架构~在global.asax里写了一个异常跳转,不错!
    EF架构~为导航属性赋值时ToList()的替换方案
  • 原文地址:https://www.cnblogs.com/jassin-du/p/8379173.html
Copyright © 2020-2023  润新知