Django组件---Django请求生命周期和中间件

Django请求生命周期

      

说明:

  • client代表浏览器,浏览器的内部为我们封装了socket,Django的WSGI模块也为我们封装了socket
  • 当用户在浏览器输入URL或者点击某一个链接的时候,浏览器会生成请求头(get)和请求体(post)发送给服务器
  • 请求到达Django的服务器之后,首先WSGI会根据http请求将请求的信息解包,然后封装到HttpRequest中,
  • 再依次通过Django的中间件proces_request方法(Django自带7个中间件,每个中间件都有一个类,,每个类中都有process_request的方法)
  • 然后通过URL控制器分发后,执行对应的视图,视图中可以根据对应的请求拿到自己需要的数据,拿到的数据通过render渲染的方式,传送给服务器
  • 返回的时候也会依次经过中间件的process_request方法
  • 在经过WSGI模块WSGI根据http响应协议的格式对响应消息进行封装,然后返回给客户端(浏览器)
  • 客户端浏览器收到响应的数据,经过渲染,显示给用户

中间件的概念

  中间件是介于request和response之间的一道处理过程,相对来说比较轻量,在全局上改变django全局的输入和输出,每一个中间件都有不同的功能

Django中间件的定义

  1. Middleware is a framework of hooks into Djangos request/response processing. <br>Its a light, low-level plugin system for globally altering Djangos input or output.

如果你想修改请求,例如被传送view中的HttpRequest对象。或者你想修改view返回的HttpResponse对象,这些都可以通过中间件(middleware)来实现。可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。

django默认的middleware(中间件)

  1. MIDDLEWARE = [
  2. 'django.middleware.security.SecurityMiddleware',
  3. 'django.contrib.sessions.middleware.SessionMiddleware',
  4. 'django.middleware.common.CommonMiddleware',
  5. 'django.middleware.csrf.CsrfViewMiddleware',
  6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  7. 'django.contrib.messages.middleware.MessageMiddleware',
  8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9. ]

自定义中间件(中间件一共有四种方法)

  1. process_request
  2.  
  3. process_view
  4.  
  5. process_response
  6.  
  7. process_exception

#process_request和process_response

解释:

  当用户发起请求的时候会依次经过所有的中间件,请求的process_request执行到view的函数中,view函数处理过后,再一次穿过中间件,process_response会最后返回给用户.

这些都是django 的中间件,我们也可以自己定义中间件

自定义中间件:

1.书写一个类,必须继承MiddlewareMinx,但是需要导入from django.utils.deprecation import MiddlewareMixin

具体步骤:

1.视图(view)

def index(request):

  print("view函数")

  return  HttpResponse("ok")

2.中间件Mymiddlewares.py

  1. from django.utils.deprecation import MiddlewareMixin
  2. from django.shortcuts import HttpResponse
  3.  
  4. class Md1(MiddlewareMixin):
  5.  
  6. def process_request(self,request):
  7. print("Md1请求")
  8.  
  9. def process_response(self,request,response):
  10. print("Md1返回")
  11. return response
  12.  
  13. class Md2(MiddlewareMixin):
  14.  
  15. def process_request(self,request):
  16. print("Md2请求")
  17. #return HttpResponse("Md2中断")
  18. def process_response(self,request,response):
  19. print("Md2返回")
  20. return response

结果:

  1. Md1请求
  2. Md2请求
  3. view函数...
  4. Md2返回
  5. Md1返回

注意:如果当请求到达请求2的时候直接不符合条件返回,即return HttpResponse("Md2中断"),程序将把请求直接发给中间件2返回,然后依次返回到请求者,结果如下:

返回Md2中断的页面,后台打印如下:

  1. Md1请求
  2. Md2请求
  3. Md2返回
  4. Md1返回

流程图如下:

process_view

  1.   process_view(self, request, callback, callback_args, callback_kwargs)

Mymiddlewares.py修改如下:

  1. from django.utils.deprecation import MiddlewareMixin
  2.      from django.shortcuts import HttpResponse
  3.  
  4. class Md1(MiddlewareMixin):
  5. def process_request(self,request):
  6. print("Md1请求")
  7. # return HttpResponse("Md1中断")
  8. def process_response(self,request,response):
  9. print("Md1返回")
  10. return response
  11. def process_view(self, request, callback, callback_args, callback_kwargs):
  12. print("Md1view")
  13.  
  14. class Md2(MiddlewareMixin):
  15. def process_request(self,request):
  16. print("Md2请求")
  17. # return HttpResponse("Md2中断")
  18. def process_response(self,request,response):
  19. print("Md2返回")
  20. return response
  21. def process_view(self, request, callback, callback_args, callback_kwargs):
  22. print("Md2view")

打印结果如下:

  1. Md1请求
  2.   Md2请求
  3.   Md1view
  4.   Md2view
  5.   view函数...
  6.   Md2返回
  7.   Md1返回

分析上面的过程,如下面流程图:

      

当最后一个中间的process_request到达路由关系映射之后,返回到中

  1. process_exception(self, request, exception)

间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户。

  1. class Md1(MiddlewareMixin):
  2. def process_request(self,request):
  3. print("Md1请求")
  4. def process_response(self,request,response):
  5. print("Md1返回")
  6. return response
  7. def process_view(self, request, callback, callback_args, callback_kwargs):
  8. print("callback ") # 访问index时打印<function index at 0x0000000003EF48C8>
  9. # 说明callback就是当前请求url对应的视图函数名
  10. response = callback(request,*callback_args,**callback_kwargs)
  11. return response

注意:process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行。

3、process_exception

流程图如下:

      

Mymiddlewares.py修改如下:

  1. class Md1(MiddlewareMixin):
  2. def process_request(self,request):
  3. print("Md1请求")
  4. def process_response(self,request,response):
  5. print("Md1返回")
  6. return response
  7. def process_view(self, request, callback, callback_args, callback_kwargs):
  8. # response=callback(request,*callback_args,**callback_kwargs)
  9. # return response
  10. print("md1 process_view...")
  11. def process_exception(self,request, exception):
  12. print("md1 process_exception...")
  13.  
  14. class Md2(MiddlewareMixin):
  15. def process_request(self,request):
  16. print("Md2请求")
  17. def process_response(self,request,response):
  18. print("Md2返回")
  19. return response
  20. def process_view(self, request, callback, callback_args, callback_kwargs):
  21. print("md2 process_view...")
  22. def process_exception(self, request, exception):
  23. print("md2 process_exception...")
  24. return HttpResponse(exception)

当视图函数出现错误时,打印结果如下(页面接收到错误类型):

  1. Md1请求
  2.     Md2请求
  3.     md1 process_view...
  4.     md2 process_view...
  5.     view函数...
  6.     md2 process_exception...
  7.     Md2返回
  8.     Md1返回

应用案例:

1、做IP访问频率限制

某些IP访问服务器的频率过高,进行拦截,比如限制每分钟不能超过20次。

2、URL访问过滤

Django组件---Django请求生命周期和中间件的更多相关文章

  1. Django组件 - Django请求生命周期、中间件

    一.Django请求生命周期 在学习中间件之前,先了解一下Django的请求生命周期,如下图: 1)client代表浏览器,浏览器内部为我们封装了socket,Django的WSGI模块也封装了soc ...

  2. Django的请求生命周期与中间件中的5中方法

    请求生命周期: 客户端——>WSGI——> 中间件——>路由匹配——>视图函数——>WSGI——>客户端 中间件: 在全局层明处理请求和响应的 form djang ...

  3. Django简介,请求生命周期,静态文件配置

    Web框架 ​ Web框架(Web framework)是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方 ...

  4. [oldboy-django][2深入django]django一个请求的生命周期 + WSGI + 中间件

    1 WSGI # WSGI(是一套协议,很多东西比如wsgiref, uwsgiref遵循这一套协议) - django系统本质 别人的socket(wsgiref或者uwsgiref) + djan ...

  5. Django中间件-跨站请求伪造-django请求生命周期-Auth模块-seettings实现可插拔配置(设计思想)

    Django中间件 一.什么是中间件 django中间件就是类似于django的保安;请求来的时候需要先经过中间件,才能到达django后端(url,views,models,templates), ...

  6. Django框架10 /sweetalert插件、django事务和锁、中间件、django请求生命周期

    Django框架10 /sweetalert插件.django事务和锁.中间件.django请求生命周期 目录 Django框架10 /sweetalert插件.django事务和锁.中间件.djan ...

  7. Django框架请求生命周期

    先看一张图吧! 1.请求生命周期 - wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask.Django) - 中间件,帮助我们对请求进行校 ...

  8. django请求生命周期,FBV和CBV,ORM拾遗,Git

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...

  9. $Django orm增删改字段、建表 ,单表增删改查,Django请求生命周期

    1 orm介绍  ORM是什么   ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM.  一 ...

随机推荐

  1. swiper(轮播)组件

    swiper是一个非常强大的组件 但是需要swiper-item这个标签来实现他想显示的内容 swiper-item标签有个item-id的属性,属性值:字符串 是swiper-item的标识符: 一 ...

  2. 【初识TypeScript】 配置环境后运行Hello World编译报错.

    第一次接触TypeScript,配置好环境后, 发现连编写个最基本的Hello World都报错,代码如下: const hello:string = "Hello World!" ...

  3. OGG-DDL复制

    http://blog.sina.com.cn/s/blog_96d348df0102vg6q.html OGG目前只支持Oracle和TeraData的ddl复制,Oracle数据库能够支持除去数据 ...

  4. Oracle-buffer cache、shared pool

    http://blog.csdn.net/panfelix/article/details/38347059   buffer pool 和shared pool 详解 http://blog.csd ...

  5. 线性回归 r python 比较

    w http://blog.sina.cn/dpool/blog/s/blog_70f632090101bp8u.html

  6. debugfs linux rm 删除 恢复 Attempt to read block from filesystem resulted in short read while opening filesystem

    w 删除具有空字符的文件 反斜杠来转义下一个字符 rm -R Samples\ -\ Copy well@well:/home/etc/project/apilinux/MarketplaceWebS ...

  7. liunx 定时任务crontab格式说明

    每分钟执行 */1 * * * * 每小时执行 0 * * * * 每天执行 0 0 * * * 每周执行 0 0 * * 0 每月执行 0 0 1 * * 每年执行 0 0 1 1 *

  8. plsql汉化后,表格列注释中文显示成?号

  9. 使用pyautogui替代selenium,图像识别进行web自动化测试--基于python语言

    这里演示一下使用pyautogui替代selenium进行web自动化测试,并不建议使用pyautogui进行web自动化测试,因为元素的ui一旦有长宽变化,或者风格的变化,执行时就会发生异常,仅当学 ...

  10. JavaSE编码试题强化练习7

    1.编写应用程序,创建类的对象,分别设置圆的半径.圆柱体的高,计算并分别显示圆半径.圆面积.圆周长,圆柱体的体积. /** * 圆类 */ public class Circle { /** * 类属 ...