网上很多写法,都是传统的写法,

process_request和process_response方法,还可以用,但process_view的执行流程已经不行了。

看了官方文档,推荐的写法,也是用__call__方法来作实现了。

我试了新老方法,从输出,可以看出效果了。

中间件处理的顺序还是request从上到下,response从下回到上的。

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

class Row1(MiddlewareMixin):
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def process_request(self, request):
        print('中间件1的请求')

    def process_response(self, request, response):
        print('中间件1的返回')
        return response

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        print('中间件1的 view前调用')
        response = self.get_response(request)

        # Code to be executed for each request before
        # the view (and later middleware) are called.

        print('中间件1的 view之后调用')

        return response

class Row2(MiddlewareMixin):
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def process_request(self, request):
        print('中间件2的请求')
        # return HttpResponse('前端显示:中间件:M2.process_request')

    def process_response(self, request, response):
        print('中间件2的返回')
        return response

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        print('中间件2的 view前调用')
        response = self.get_response(request)

        # Code to be executed for each request before
        # the view (and later middleware) are called.

        print('中间件2的 view之后调用')

        return response

class Row3(MiddlewareMixin):
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def process_request(self, request):
        print('中间件3的请求')

    def process_response(self, request, response):
        print('中间件3的返回')
        return response

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('中间件3的 view')

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',
    'Middle.cm1.Row1',
    'Middle.cm1.Row2',
    'Middle.cm1.Row3',
]

输出,注意Row3里process_view输出没有反应,

而Row1和Row2的process_request, process_rewponse的输出被忽略。

Quit the server with CTRL-BREAK.
中间件1的 view前调用
中间件2的 view前调用
中间件3的请求
中间件3的返回
中间件2的 view之后调用
中间件1的 view之后调用
[03/Jan/2019 20:08:58] "GET / HTTP/1.1" 200 16348

最新文章

  1. sublime-text3 3059基本配置
  2. JavaScript(四)——DOM操作——Window.document对象
  3. [转]ubuntu 14.04 如何开启和关闭触控板
  4. 前端性能优化----yahoo前端性能团队总结的35条黄金定律
  5. javaweb--下载文件列出
  6. Linux下如何查看tomcat是否启动
  7. turing 项目引用
  8. 数往知来 asp.net 聊天室问题解决方案<十六>
  9. class_create(),device_create()使用
  10. 创建view
  11. ubuntu-terminal快捷键
  12. WSGI及gunicorn指北(二)
  13. mysql 与 oracle 的连表update
  14. VMware下Mac系统自适应屏幕
  15. js MDN 查看
  16. C语言 · 递归求二项式系数值
  17. 【代码审计】CLTPHP_v5.5.3后台任意文件删除漏洞分析
  18. 在 Windows 10 中开启移动 WLAN 热点
  19. September 06th 2017 Week 36th Wednesday
  20. C语言:凯撒密码的实现

热门文章

  1. Study 3 —— Python运算符
  2. IdeaVim-常用操作
  3. Dubbo协议
  4. hadoop - 基础操作
  5. 并行动画组QParallelAnimationGroup
  6. B - 集合选数 (状压DP)
  7. Informatic学习总结_day02_增量抽取
  8. kdevelop 添加对 C++11的支持
  9. HTTP协议中PUT和POST使用上的区别
  10. python2 与 python3 语法区别