美文网首页
Django_中间件

Django_中间件

作者: 魔曦帝天 | 来源:发表于2019-11-12 20:29 被阅读0次

Django的中间件的简介

Django的中间件类似于linux中的管道符
Django的中间件实质就是一个类,类之中有Django已经定义好了一些方法.

每个http请求都会执行中间件中的一个或多个方法
进入Django中的请求都会执行process_request方法;
Django返回的信息都会执行process_response方法.;
Django内部的中间件注册在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',
]
导入from django.middleware.csrf import CsrfViewMiddleware模块,查看其源码

class CsrfViewMiddleware(MiddlewareMixin)
可以看到CsrfViewMiddleware是继承MiddlewareMixin这个中间件的

再查看MiddlewareMixin的源码

class MiddlewareMixin(object):
    def __init__(self, get_response=None):
        self.get_response = get_response
        super(MiddlewareMixin, self).__init__()    
    def __call__(self, request):
        response = None
        if hasattr(self, 'process_request'): # 如果请求`self`中有这个属性,则response为请求,中间件函数返回的值)
            response = self.process_request(request)
        if not response:  
            response = self.get_response(request)  # 如果没有response,就为self.get_response(request)中的参数(None)
        if hasattr(self, 'process_response'): # 如果都没有则response 为None
            response = self.process_response(request, response)
        return response
可以知道MiddlewareMixin是调用了其内部的__call__方法,
__call__方法以反射的方式执行process_request和process_response方法.

中间件的应用

新建一个middleware项目,在项目的根目录中新建一个名为middleware的包,在这个package中,新建一个middleware.py文件.

导入django.utils.depercation 的MiddlewareMixin,编写一个类,继承MiddlewareMixin,重写process_requestprocess_response

process_request方法不能有return,一定要使用return的时候,要配合条件判断语句执行
process_response方法一定要有return,否则程序会运行错误
process_view方法不能有return,否则视图函数不会执行
process_exception方法只有在程序出现运行错误的时候才会执行
process_exception方法设定return时,程序不会再执行后续中间件中的process_exception
process_template_response方法只有在视图函数中使用render方法返回信息的时候才会执行

    from django.utils.deprecation import MiddlewareMixin
    
    class middle_ware1(MiddlewareMixin):
    
        def process_request(self,request):
            print("middle_ware1.process_request")
    
        def process_response(self,request,response):
            print("middle_ware1.process_response")
            return response

settings.py配置文件的第一行注册这个中间件

MIDDLEWARE = [
    'middleware.middleware.middle_ware1'(自定义中间件)

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

先执行process_request方法,因为process_request方法有返回值,程序不会再执行后面的中间件,而是直接执行process_response方法,然后返回信息给用户.
现在如果有http请求到达服务端,先执行中间件middle_ware1process_request方法,再执行后面的中间件,然后到达视图函数.

中间件的依次执行为:

先执行middle_ware1的process_request方法,
再执行middle_ware2的类的process_request方法,
最后才执行Django的视图函数.
返回时,先执行middle_ware2的类中的process_response函数,
然后再执行middle_ware1的类中的process_response函数.

程序执行流程:

先执行所有中间件中的process_request方法-->进行路由匹配-->执行中间件中的的process_view方法

-->执行对应的视图函数-->执行中间件中的process_response方法

总结

中间件里本质上就是一个类,
对全局的http请求做处理的时候可以使用中间件
中间件中的方法不一定要全部使用,需要哪个用哪个

相关文章

  • Django_中间件

    Django的中间件的简介 Django的中间件类似于linux中的管道符Django的中间件实质就是一个类,类之...

  • Django安装教程

    windows下安装Django_百度经验

  • Django_中文教程[www.rejoiceblog.com]

    下载地址:Django_中文教程[www.rejoiceblog.com].pdf

  • django_中间件(view层无参数使用)

    一、什么是中间插件 我理解的中间插件就是过滤器的一起,所有的请求,先到中间插件过滤,过滤后进行url匹配,到对应的...

  • django_中间件(view层有参数使用)

    一、使用场景 url('/login/(\d+)',views.login)这种的url对应view层def lo...

  • django_缓存

    一、什么是缓存 我的理解就是将数据信息,保存在数据库以外的地方,当然也可以保存到数据库,做到一种数据延迟的效果,降...

  • django_分页

    一、基础篇 =view模块处理 html 页面 二、讲解 对页数限制的讲解 转换成代码 上一页/下一页操作 代码如...

  • 翻译

    Laravel 的路由中间件 简介 创建中间件 注册中间件全局中间件为路由指定中间件中间件组 中间件参数 Term...

  • django_多表查询

    一、一对多 利用ForeignKey 创建表 注关联表中会自动添加字段后面加_id,相当于publish _id,...

  • Django_完善博客

    通过写一个博客项目,来串联自己的知识点,并总结一些小的技巧 页面介绍 1.博客主页面 2.博客文章内容页面...

网友评论

      本文标题:Django_中间件

      本文链接:https://www.haomeiwen.com/subject/kbgqictx.html