Django中间件

Posted rongge95500

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django中间件相关的知识,希望对你有一定的参考价值。

 

一、概念

  • 是一个类,用来在全局范围内处理请求和响应的一个钩子

二、中间件的五个方法

  • process_request(self,request)
  • process_view(self, request, view_func, view_args, view_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)

自定义中间件

  • 在app下创建一个模块
from django.utils.deprecation import MiddlewareMixin


class MyMiddle_1(MiddlewareMixin):
    def process_request(self, request):
        print(‘MyMiddle_1 中的 process_request‘)

    def process_response(self, request, response):
        print(‘MyMiddle_1 中的 process_response‘)
        return response


class MyMiddle_2(MiddlewareMixin):
    def process_request(self, request):
        print(‘MyMiddle_2 中的 process_request‘)

    def process_response(self, request, response):
        print(‘MyMiddle_2 中的 process_response‘)
        return response
  • 在 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‘,
    ‘app01.mymiddle.MyMiddle_1‘,
    ‘app01.mymiddle.MyMiddle_2‘
]
  • 在 views.py 写一个视图函数
from django.shortcuts import render, HttpResponse


def test(request):
    print(‘这儿是视图函数‘)
    return HttpResponse(‘ok‘)

然后去浏览器访问这个视图,pycharm 终端会打印下面的内容

MyMiddle_1 中的 process_request
MyMiddle_2 中的 process_request
这儿是视图函数
MyMiddle_2 中的 process_response
MyMiddle_1 中的 process_response

调换中间件的注册顺序之后执行,发现执行的顺序也会发生相应的变化,这说明中间件的执行顺序是从上往下执行的,从中还可以找出五个方法的规律

2.1 process_request

  • 执行时间:在视图函数执行之前执行

  • 参数:request-----是视图函数中用到的request

  • 执行顺序:按照在MIDDLEWARE中注册的顺序从上往下执行

  • 返回值:None-----正常流程往后走;HTTPResponse对象-----当前中间件后面中间件的process _requestprocess_response方法和视图函数都不会执行,只执行当前中间件的process _response 方法及之前的中间件的process _response 方法

2.2 process_response

  • 执行时间:在视图函数执行之后执行

  • 参数:request-----> 是视图函数中用到的 request

          response---->是视图函数中返回的 response

  • 执行顺序:按照在MIDDLEWARE中注册的顺序从下往上执行

  • 返回值:必须是response对象

技术分享图片

2.3 process_view

  • 执行时间:在process_request方法及路由匹配之后、在视图函数执行之前执行

  • 参数:

    • view_func-------> 要执行的视图函数

    • view_args-------> 视图函数的位置参数

    • view_kwargs-------> 视图函数的关键字参数

  • 执行顺序:按照在MIDDLEWARE中注册的顺序从上往下执行

  • 返回值:None-----正常流程往后走;

2.4 process_exception

  • 执行时间:在视图函数之后,process_response之前,有异常时才会触发

  • 参数:exception-----错误信息对象

  • 执行顺序:按照在MIDDLEWARE中注册的顺序从下往上执行

  • 返回值:None-------正常往后走;返回HTTPResponse对象,注册顺序之前的中间件的process_exception方法不会执行,会执行所有中间件的process_response方法

2.5 process_template_response

  • 执行时间:在视图函数之后,process_response之前,response对象有render方法时才会触发

  • 参数

  • 执行顺序:按照注册顺序倒着执行

  • 返回值:返回response

 

以上是关于Django中间件的主要内容,如果未能解决你的问题,请参考以下文章

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

django-中间件

django之设置中间件模板

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]