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

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

Django 2.0 Middleware的写法的更多相关文章

  1. Django 2.0官方文档中文 渣翻 总索引(个人学习,欢迎指正)

    Django 2.0官方文档中文 渣翻 总索引(个人学习,欢迎指正) 置顶 2017年12月08日 11:19:11 阅读数:20277 官方原文: https://docs.djangoprojec ...

  2. Django 2.0官方文档中文 总索引

    Django 2.0官方文档中文 渣翻 总索引 翻译 2017年12月08日 11:19:1 官方原文: https://docs.djangoproject.com/en/2.0/ 当前翻译版本:  ...

  3. Django 从0开始创建一个项目

    title: Django 从0开始创建一个项目 tags: Django --- Django 从0开始创建一个项目 创建Django工程及配置 创建工程:django-admin starproj ...

  4. django 2.0 xadmin 错误集锦

    转载 django 2.0 xadmin 错误集锦 2018-03-26 10:39:18 Snail0Li 阅读数 5188更多 分类专栏: python   1.django2.0把from dj ...

  5. Django分析之Middleware中间件

    写了几周的脚本,今天终于开始接触web框架了~学习Python的web框架,那么Django就几乎是必修课了,这次的工作是先打打下手,主要的任务是在setting中添加版本号,在渲染静态css,js的 ...

  6. Django 2.0 新特性 抢先看!

    一.Python兼容性 Django 2.0支持Python3.4.3.5和3.6.Django官方强烈推荐每个系列的最新版本. 最重要的是Django 2.0不再支持Python2! Django ...

  7. Django 2.0 学习

    Django django是基于MTV结构的WEB框架 Model 数据库操作 Template 模版文件 View 业务处理 在Python中安装django 2.0 1 直接安装 pip inst ...

  8. Django组件之Middleware

    一.中间件 在django的settings.py文件下,有一个变量为MIDDLEWARE,里面放的就是中间件. MIDDLEWARE = [ 'django.middleware.security. ...

  9. Django 2.0.3 使用笔记

    运行环境: Python 3.5.2 Django 2.0.3 Django Admin中model显示为中文 定义model时,定义一个Meta对象,设置需要显示的中文名称.verbose_name ...

随机推荐

  1. C# 网络常用操作类NetHelper.cs

    一个非常完整的网络操作帮助类,包含20多个常用方法,例如: IP地址的验证以及截取. 端口的验证. 电子邮件的发送. 获取计算机名. IP地址的获取以及TCP. UDP连接的创建和数据发送等. usi ...

  2. centos shell运行报语法错误: 未预期的文件结尾

    可能原因: 脚本是windows下写的,然后传到linux下运行的 需要给dos文件格式转成unix dos转unix 安装: yum install dos2unix 命令: dos2unix fi ...

  3. 集大软件工程15级个人作业Week1

    集大软件工程15级个人作业Week1 孙志威 201521123077 博客园主页 码云地址 阅读参考材料,并回答下面几个问题 (1)回想一下你初入大学时对网络工程专业的畅想 当初你是如何做出选择网络 ...

  4. Zabbix 监控服务

    熟悉了解一些  zabbix 基础项目监控 zabbix_get 相关操作 :获取 item 监控数据 基本格式: -s --host: 指定客户端主机名或者IP -p --port:客户端端口,默认 ...

  5. matplotlib-2D绘图库

    安装  python -m pip install matplotlib  允许中文: 使用matplotlib的字体管理器指定字体文件 plt.rcParams['font.sans-serif'] ...

  6. CSS font-family 各名称一览表

    参考链接:https://blog.csdn.net/cddcj/article/details/70739481

  7. 在使用kvc进行赋值的时候,有时候会遇到null值,这个时候我们使用kvc会报错

    在使用kvc进行赋值的时候,有时候会遇到null值,这个时候我们使用kvc会报错,如何解决 控制器代码如下: // // ViewController.m // 02-模型中的赋值 // // Cre ...

  8. springMVC入门(一)

    1.   SpringMVC入门 1.1SpringMVC是什么 Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出 ...

  9. linux笔记_day05

    1.bash以及特性 shell:外壳 GUI:KDE,Gnome,Xfce CLI:sh,csh,ksh,bash(born again shell) 进程:在每个进程看来,当前主机上只存在内核和当 ...

  10. 实现Servlet容器一

    本文是阅读<深度解析Tomcat>的笔记. 源码:http://www.brainysoftware.com/source/9780975212806.zip├── src│   └── ...