码迷,mamicode.com
首页 > 其他好文 > 详细

中间件

时间:2018-07-22 00:29:00      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:rect   定义   规则   bar   one   app   gem   bsp   http   

 

什么是中间件?

官方说法 :中间件就是一个出来Django的请求和响应的框架级别的钩子。它是一个轻量级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件负责做一些特定的功能

 

但是由于其影响的是全局,所以需要谨慎似乎用,使用不当会影响性能

 

说得直白一点 中间件是帮助我们在视图函数执行之前和执行之后 都可以做一些额外的操作,它本质就是一个自定义类,类中定义了几个方法,Django框架会在出来请求的特定的时间去执行这些方法

 

其实就是定义一个全局的装饰器 这个装饰器用来装饰你的视图函数的  

 

我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下图的MIDDLEWARE配置项。

技术分享图片
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‘,
]
技术分享图片

MIDDLEWARE配置项是一个列表,列表中是一个个字符串,这些字符串其实是一个个类,也就是一个个中间件。

 

 

 

我们之前已经接触过一个csrf相关的中间件了?我们一开始让大家把他注释掉,再提交post请求的时候,就不会被forbidden了,后来学会使用{%csrf_token%}之后就不再注释这个中间件了。

那接下来就学习中间件中的方法以及这些方法什么时候被执行。

 

 

 

自定义中间件:

 

中间件可以定义五个方法,分别是(pricess_request、process_views、process_template、process_exception、process_response)

 

  • 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)

 

以上的方法的返回值可以是None或者一个HttpResponse对象,如果是None,则按照Django定义的规则向后继续执行,如果是HttpResponse对象,则直接将对象返回给用户

 

 

首先你要在你的Django种开辟的app种建立一个存放中间件的py文件,然后导入中间件需要的模块

from django.utils.deprecation import MiddlewareMixin

 

 

自定义一个中间件示例

 

from django.shortcuts import render,redirect ,HttpResponse

from django.utils.deprecation import  MiddlewareMixin



class MD1(MiddlewareMixin):

    def process_request(self,request):   #request的执行是在视图函数之前先执行这个 
        print(我是MD1的process_request)



    def process_response(self,request,response):   # 这个时候你的response是接收过来的是可能另外一个中间件传递过来的  那么你就要把它接收过来

        print(我是MD1的process_response)

        return response  #然后把你接收的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,
    once.middlewares.MD1,  #  导入你的once中的middlewares中自定义的中间件 MD1
    once.middlewares.MD2, # 导入你的once中的middlewares中自定义中间件MD2
]

 

 

定义中间件的方法:

 

process_request :

process_request有一个参数,就是reqeust,这个request和视图函数中的request是一样的,

它的返回值可以是None也可以是HttpResponse对象。返回值是None的话 按照正常流程继续往下走,交给下一个中间件处理,如果是HttpResponse对象,Django将不执行视图函数  而将响应对象返回给浏览器

 

 我们来看看多个中间件时,Django是如何执行其中的process_request方法的。

 

 中间件  

from django.shortcuts import render,redirect ,HttpResponse

from django.utils.deprecation import  MiddlewareMixin

class MD1(MiddlewareMixin):

    def process_request(self,request):   #request的执行是在视图函数之前先执行这个
        print(我是MD1的process_request)

    def process_response(self,request,response):   # 这个时候你的response是接收过来的是可能另外一个中间件传递过来的  那么你就要把它接收过来
        print(我是MD1的process_response)
        return response  #然后把你接收的response传递出去 给下一个中间件或者视图函数

class MD2(MiddlewareMixin):
    def process_request(self,reqeust):
        print(是MD2的process_request)

 

 通过执行可以看到

技术分享图片

 

 

 技术分享图片

通过以上两幅图就可以得到 request是在视图函数执行之前执行的

 

中间件

标签:rect   定义   规则   bar   one   app   gem   bsp   http   

原文地址:https://www.cnblogs.com/zhaoyunlong/p/9348367.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!