Django组件之Middleware

  一、中间件

  在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‘,
]

上面就是Django自带的7个中间件,我们想看中间件长什么样子,只需要复制中间件,用from引入,点进去看就可以了。比如看第二个中间件:from django.middleware.sessions.middleware import SessionMiddleware,看到的结果如下:
class SessionMiddleware(MiddlewareMixin):    def __init__(self, get_response=None):        self.get_response = get_response        engine = import_module(settings.SESSION_ENGINE)        self.SessionStore = engine.SessionStore

def process_request(self, request):        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)        request.session = self.SessionStore(session_key)

def process_response(self, request, response):     。。。。。。我把process_response()方法下的东西省略了。但我们可以清楚的看出它就是一个继承于MiddlewareMixin的类。

  所谓的中间件,就是存在于socket和视图函数中间的一种过滤器。浏览器客户端通过socket发送请求来,要经过一层层中间件的process_request()方法,在进入视图,视图函数执行完毕后,又要经过一层层中间件的process_response()方法,然后再通过socket发送给浏览器客户端。Django服务器端的socket是由wsgiref模块封装而成的,它还帮我们把原生的数据解析成了request对象,从而在Django服务器端才可以用request对象去拿值。

  中间件有四个方法,分别是:

1,process_request(self,request)
2,process_response(self, request, response)
3,process_view(self, request, callback, callback_args, callback_kwargs)
4,process_exception(self, request, exception)

  现在我们一个一个的来分析每个方法的运用及效果,四个方法讲完了,中间件就学完了。

  二、process_request(),process_response()

  上面我们说了,浏览器发送请求过来,会经过一层层的process_request,具体来说,会从最上面的中间件到最下面的中间件。执行完视图函数之后,会从从下往上执行每个中间件的process_response(),之后再发送给浏览器。

  通常情况下,process_request()是不会写return的,一旦某个中间件的process_request()写了return,那后面的中间件的process_request()就不会执行了,也不会到视图函数了,直接从自己的process_response()依次往上返回。

  通常情况下,process_response()都要写上return response。一旦有一个中间件的process_response()没有写return response,那么数据走到这一个中间件时,数据就会丢失,后面要执行的中间件的process_response()都会没有数据。

  三、process_views()

  上面的第二点的执行流程是基于只有request和response的情况下的,如果加上了process_views()。首先还是先走每个中间件的request,然后走到urls.py文件,但现在不会马上去执行视图,而是先要从上往下走每个中间件的process_views(),走完之后再走视图函数,再走每个中间件的response。

  第一步是process_request,第二步是process_views,第三步是执行视图函数,第四步是process_response

  通常情况下,process_views 也不要加return Httpresponse(‘fff‘),一旦加上了,从这个中间件以下的中间件的process_views就不会执行,视图函数也不会执行。直接跳到最下面中间件的response开始返回。

  第一步是process_request,第二步是走部分的process_views,第三步是process_response

  process_views()方法还可以写上回调视图函数,它会把对应的视图函数给执行了,然后返回

def process_view(self,request,callback,callback_args,callback_kwargs):    response=callback(request,*callback_args,**callback_kwargs)        #callback就是在经过urls.py时对应的视图函数,现在直接在process_views()直接回调视图函数,并且执行     return response这种情况下,会在执行这个中间件的process_views,把对应的视图函数也一起执行了,然后就直接到最下面中间件从下往上执行response,返回

  第一步是prosee_request,第二步是走部分的process_views,第三步是执行process_views里的回调视图函数,第四步是process_response

  四、process_exception()

  上面的执行流程是基于没有process_exception()情况下的,加上process_exception(),在执行完视图函数之后,后从下往上执行中间件的process_exception(),然后在从下往上执行中间件的response,然后返回。process_exception()的作用是捕获视图函数的错误。

  第一步是process_request,第二步process_views,第三步执行视图函数,第四步process_exception,第五步是process_response.

原文地址:https://www.cnblogs.com/12345huangchun/p/10251958.html

时间: 2024-11-05 21:49:19

Django组件之Middleware的相关文章

Django组件拾忆

知识预览 一 Django的form组件 二 Django的model form组件 三 Django的缓存机制 四 Django的信号 五 Django的序列化 回到顶部 一 Django的form组件 回到顶部 二 Django的model form组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来 回到顶部 三 Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改

Django分析之Middleware中间件

写了几周的脚本,今天终于开始接触web框架了~学习Python的web框架,那么Django就几乎是必修课了,这次的工作是先打打下手,主要的任务是在setting中添加版本号,在渲染静态css,js的路径时附带版本号,例如“example.v1124.css”,然后再在request请求中祛除掉版本号.为什么要这么做呢?因为这样做的话在前端输出静态文件的路径就会加上就会加上版本号,这样当开发出新的静态文件的时候,客户端就会强制刷新本地的缓存,为了达到这个目的就要首先要在settings文件中配置

django之中间件middleware

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图. 与mange.py在同一目录下的文件夹 wupeiqi/middleware下的auth.py文件中的Authentication类 中间件中可以定义四个方法,分别是: process_r

Django组件-cookie,session

昨日内容回顾: json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() 反序列化方法:JSON.parse() ajax $.ajax({ url:"", type:"", data:{}, // 默认contentType="urlencoded" success:function(data){ } }) 一.Djang

Django组件:中间件

一.中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到性能. Django的中间件的定义: Middleware is a framework of hooks into Django’s request/response processing. <br>It’s a light, low-level “plugin” system for gl

Django 2.0 Middleware的写法

网上很多写法,都是传统的写法, process_request和process_response方法,还可以用,但process_view的执行流程已经不行了. 看了官方文档,推荐的写法,也是用__call__方法来作实现了. 我试了新老方法,从输出,可以看出效果了. 中间件处理的顺序还是request从上到下,response从下回到上的. from django.utils.deprecation import MiddlewareMixin from django.shortcuts im

Django组件之中间件

中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变Django的输入以及输出.并且她改变的变量是全局的,所有需要谨慎使用,容易导致性能问题. 如果你想修改请求,例如被传送到view中的HttpRequest对象. 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现. 可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现. Django默认的Middleware

django之(中间件)middleware

中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件(内置) 详细:https://docs.djangoproject.com/en/2.2/ref/middleware/#security-middleware 1 MIDDLEWARE =

Django组件——cookie与session

Django组件--cookie与session 一.会话跟踪技术 1.什么是会话跟踪技术 先了解一下什么是会话.可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打电话,你就是客户端,而10086服务人员就是服务器,从双方接通电话那一刻起,会话就开始了,到某一方挂断电话就表示会话结束.在通话过程中,你会向10086发出多个请求,这多个请求都在一个会话中. 在JavaWeb在,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览