我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下面的MIDDLEWARE配置项,django默认自带的一些中间件:

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',
'utils.middlewares.MD1',
'utils.middlewares.MD2'
]

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

 中间件可以定义五个方法,分别是:(主要的是process_request和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对象,则直接将该对象返回给用户。

  当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。

      

上述截图中的中间件都是django中的,我们也可以自己定义一个中间件,我们可以自己写一个类,但是必须继承MiddlewareMixin

from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
def process_request(self,request):
print(id(request))
print('from MD1 process_request')
# return HttpResponse("HHHHH")
# return None def process_response(self,request,response):
# print(id(response))
print('from MD1 process_response')
return response
#----------------------------------------------------
class MD2 (MiddlewareMixin):
def process_request(self, request):
# print(id(request))
print('from MD2 process_request') def process_response(self, request, response):
# print(id(response))
print('from MD2 process_response')
return response
  • 执行时间:在视图函数执行之后
  • 参数:request -->>  与视图函数中的是同一个 /response-->>视图函数中传递的响应对象
  • 执行顺序:按照注册顺序,倒叙执行
  • 返回值:HttpResponse对象:必须是响应对象

process_view

process_view(self, request, view_func, view_args, view_kwargs)

执行时间:在process_request方法之后,在视图函数执行之前

​ 参数:

  • request -->> 跟视图函数中的是同一个
  • ​ view_func -->>  视图函数
  • ​ view_args -->> 视图函数的位置参数
  • view_kwargs-->> 视图函数的关键字参数

​ 执行顺序:按照注册顺序 顺序执行

​ 返回值:None: 正常流程

​ HttpResponse对象:不执行后面中间中的process_view方法,不执行视图函数,直接执行最后一个中间件中的process_response方法,后面正常走

from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
def process_request(self,request):
print(id(request))
print('from MD1 process_request')
# return HttpResponse("HHHHH")
# return None def process_response(self,request,response):
# print(id(response))
print('from MD1 process_response')
return response def process_view(self,request,view_func,view_args,view_kwargs):
# print(view_func)
# print(view_args)
# print(view_kwargs)
print('from MD1 process_view')
# return HttpResponse('kkkkkk') def process_exception(self,request,exception):
print ('from MD1 process_exception')
print(exception)
#-------------------------------------------------------------------------
class MD2 (MiddlewareMixin):
def process_request(self, request):
# print(id(request))
print('from MD2 process_request') def process_response(self, request, response):
# print(id(response))
print('from MD2 process_response')
return response def process_view(self,request,view_func,view_args,view_kwargs):
# print(view_func)
# print(view_args)
# print(view_kwargs)
print('from MD2 process_view') def process_exception(self, request, exception):
print('from MD2 process_exception')
print(exception)
# return HttpResponse('SSSSSS')

print(id(request))
print('from MD1 process_request')

print('from MD1 process_response')
print('from MD1 process_view')
print ('from MD1 process_exception')
print('from MD2 process_request')
print('from MD2 process_response')
print('from MD2 process_view')

print('from MD2 process_exception')
print(exception)

############################
72452584
from MD1 process_request

from MD2 process_request
from MD1 process_view
from MD2 process_view
from MD2 process_response
from MD1 process_response

      

process_template_response(self,request,response)

#除此之外还需在setting.py文件中进行注册
class LoginMD(MiddlewareMixin):
white_lst = ['/login/',] #白名单
black_lst = ['/black/',] #黑名单 def process_request(self,request):
return_url = request.path_info #黑名单限制访问
if return_url in self.black_lst:
return HttpResponse('This is an illegal URL ')
#白名单或者登录用户不做限制
elif return_url in self.white_lst or request.session.get('user'):
return None
else:
return redirect('/login/?return_url={}'.format(return_url))

python Django 中间件介绍的更多相关文章

  1. django中间件介绍

    在学习django中间件之前,先来认识一下django的生命周期,如下图所示: django生命周期:浏览器发送的请求会先经过wsgiref模块处理解析出request(请求数据)给到中间件,然后通过 ...

  2. Python Django 中间件

    在http请求 到达视图函数之前   和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 中间件的执行流程 1.执行完所有的request方法 到达视图函数. ...

  3. Python - Django - 中间件 process_template_response

    process_template_response(self, request, response) 有两个参数,response 是 TemplateResponse 对象(由视图函数或者中间件产生 ...

  4. Python - Django - 中间件 process_exception

    process_exception(self, request, exception) 函数有两个参数,exception 是视图函数异常产生的 Exception 对象 process_except ...

  5. Python - Django - 中间件 process_view

    process_view 的执行顺序也是按照 settings.py 中的顺序来执行 process_view 在 urls.py 的对应关系之后,在执行视图函数之前执行 如果返回 None,则继续执 ...

  6. Python - Django - 中间件 process_response

    process_response 函数是执行完 views.py 后执行的函数 process_response 函数有两个参数,一个是 request,一个是 response,response 是 ...

  7. Python - Django - 中间件 process_request

    process_request 函数是中间件在收到 request 请求之后执行的函数 该函数的执行顺序是按照 settings.py 中中间件的配置顺序执行的 如果该函数返回 None,继续执行后面 ...

  8. python/ Django之中间件

    python/ Django之中间件 一.中间件 中间件共分为: (1)process_request(self,request) (2)process_view(self, request, cal ...

  9. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

随机推荐

  1. Linux内存描述之内存节点node--Linux内存管理(二)

    1 内存节点node 1.1 为什么要用node来描述内存 这点前面是说的很明白了, NUMA结构下, 每个处理器CPU与一个本地内存直接相连, 而不同处理器之前则通过总线进行进一步的连接, 因此相对 ...

  2. JMeter测试工具的使用

    Jmeter下载地址: http://jmeter.apache.org/download_jmeter.cgi 解压Jmeter压缩包,双击jmeter.bat 右击测试计划 右击线程组 右击HTT ...

  3. 读写锁ReentrantReadWriteLock的使用

    package com.thread.test.Lock; import java.util.Random; import java.util.concurrent.locks.Lock; impor ...

  4. springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数

    http://blog.csdn.net/truong/article/details/30971317 http://blog.csdn.net/fytain/article/details/439 ...

  5. kernel笔记——内核同步与锁

    内核同步 内核同步解决并发带来的问题,多个线程对同一数据进行修改,数据会出现不一致的情况,同步用于保护共享数据等资源. 有两种形式的并发: 同时进行式并发,在不同cpu上执行的进程同时访问共享数据 二 ...

  6. WPFの命中测试

    概述:  WPF中的Canvas是常用的一个绘图控件,可以方便地在Canvas中添加我们需要处理的各种元素如:图片.文字等.但Canvas中元素增加到一定数量,并且有重合的时候,我们如何通过在Canv ...

  7. Ubuntu 18.04安装MySQL指南

    前言 Ubuntu18.04想要安装MySQL,只能安装MySQL8.0版本.如果你直接 apt-get install mysql-server 安装,那么恭喜踩坑! 先给出彻底删除mysql5.x ...

  8. InheritedWidget

    下面这个示例是InheritedWidgt的一个简单用法: class CounterProvider extends InheritedWidget{//数据之前必须加上final,下面这三个数据都 ...

  9. JDK1.8源码(九)——java.util.LinkedHashMap 类

    前面我们介绍了 Map 集合的一种典型实现 HashMap ,关于 HashMap 的特性,我们再来复习一遍: ①.基于JDK1.8的HashMap是由数组+链表+红黑树组成,相对于早期版本的 JDK ...

  10. @Valid注解的使用(转)

    原文地址:http://blog.csdn.net/xzmeasy/article/details/76098188 @Valid注解用于校验,所属包为:javax.validation.Valid. ...