一、中间件

https://www.cnblogs.com/maple-shaw/articles/9333824.html

中间件:是一个类处理django的请求和响应,本质上就是一个类,在类里面定义几个方法。

django的生命周期:

  1.浏览器发送一个request请求 首先到达wsgiref

  2.然后到达url路由分发 url.py

  3. 根据url分发的地址找到view里面对应的CBV或者FBV

  4.CBV或者FBV会通过model去数据库里面查数据

  5.model拿到数据以后会返回一个对象给view,view获取到template文件进行渲染。

中间件的位置介于wsgi和url之间,很多请求前请求后都要走中间件,有的方法可以直接提取到中间件里面。

五个方法的参数执行的时间顺序以及返回值

process_request(self,request)
参数:跟属视图函数中的request是同一个
执行时间:在视图函数执行之前,也在路由匹配之前
执行顺序:按照中间价注册的顺序执行
返回值:None 返回none是正常流程
    如果返回一个HttpResponse对象 当前中间件之后的中间件的process_request路由
    匹配,视图函数都不执行,直接将结果返回给浏览器。
process_response(self,reqeust,respnse)
参数:request跟属视图函数中的request是同一个
   response:response对象
执行时间:视图函数执行之后
执行顺序:按照注册顺序倒序执行
返回值:必须返回response对象
如果在MD1里面的request方法里面返回一个HttpResponse 那就不会执行MD2里面的方法
执行完MD1的request以后执行MD1的response

process_view(self,request,view_func,view_args,view_kwargs)
参数:request和view中的request是一个
   view_func:执行函数
   vies_args:位置参数
   view_kwargs:关键字参数
执行时间:视图函数执行之前,也是在路由匹配之后
执行顺序:按照注册顺序执行
返回值:
  None:正常流程
  如果在MD1里面返回一个httpresponse对象,那么不会执行view视图以及MD2里面的MD2的view
  直接执行MD2里面的response 剩下的按照正常流程执行。
process_exception(self,request,exception)
参数:
  request:
  exception:错误对象
执行时间(触发条件):视图出错后才执行
执行顺序:按照注册顺序 倒序执行
返回值:None
    如果在MD2的execption中处理了异常,就不会执行MD1里面的exception,
    如果都没处理就直接交给django处理。

process_template_response(self,request,response)
  参数:
    request:跟视图中的request同一个
    response:template_repspnse对象
  执行时间(触发条件):必须返回一个template_repspnse对象才会执行
  执行顺序:倒序

代码如下:

middileware 中间件里面的代码

from django.utils.deprecation import MiddlewareMixin

class MD1(MiddlewareMixin):
def process_request(self,request):
print('MD1 process_request') def process_response(self,reqeust,respnse):
return respnse def process_view(self,request,view_func,view_args,view_kwargs):
print('MD1 process_view') def process_exception(self,request,exception):
print('MD1 process_exception') def process_template_response(self,request,response):
print('MD1 process_exception')
response.template__name = 'index1.html'
# response.context_data['name'] = 'Ivy Wang'
return response class MD2(MiddlewareMixin):
def process_request(self,request):
print('MD2 process_request') def process_response(self,reqeust,respnse):
return respnse def process_view(self, request, view_func, view_args, view_kwargs):
print('MD2 process_view') def process_exception(self,request,exception):
print('MD2 process_exception') def process_template_response(self, request, response):
print('MD2 process_exception')
response.template_name = 'index1.html'
response.context_data['name'] = 'Ivy Wang'
return response view里面的代码
from django.shortcuts import render,HttpResponse
from django.template.response import TemplateResponse
# Create your views here
def index(request):
print('index')
# return HttpResponse('index')
return TemplateResponse(request,'index.html',{"name":"ivy"})

  

总结:

1.浏览器发请求给wsgi后是一个request对象

2.有了request对象后执行process_request方法

3.执行完所有的request方法后执行urls路由匹配

4.执行process_view

5. 执行view函数,视图函数可以通过models操作数据库,也可以通过获取模板使用response的三个方法来渲染数据

6.执行process_response对象然后交给wsgi,wsgi把数据变成浏览器认识的对象发给浏览器

Django中间件理解的更多相关文章

  1. Django 中间件理解

    中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 应用场景,对所有 ...

  2. 关于Django的理解

    Django的理解 Django的核心是中间件, 所有的请求和响应都会经过中间件 中间件是一个钩子框架, 它们可以介入请求的响应处理过程, 它用于在全局修改Django的输入和输出 Django有以下 ...

  3. Django学习之七:Django 中间件

    目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...

  4. Python菜鸟之路:Django 中间件

    前言 在正式说Django中间件之前需要先了解Django一个完整的request的处理流程.我从其他网站扒了几张图过来. 图片一: 文字流程说明:如图所示,一个 HTTP 请求,首先被转化成一个 H ...

  5. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

  6. Django中间件,CSRF(跨站请求伪造),缓存,信号,BootStrap(模板)-响应式(栅格)+模板

    Django中间件,CSRF(跨站请求伪造),缓存,信号,BootStrap(模板)-响应式(栅格)+模板 1.中间件(重要): 在Django的setting中有个MIDDLEWARE列表,里面的东 ...

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

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

  8. django中间件介绍

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

  9. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

随机推荐

  1. 图像模糊C均值聚类分割代码

    转自:直觉模糊C均值聚类与图像阈值分割 - liyuefeilong的专栏 - CSDN博客 https://blog.csdn.net/liyuefeilong/article/details/43 ...

  2. kotlin 泛型中类型投射

    fun main(arg: Array<String>) { var ints:Array<Int> = arrayOf(, , ) val any =Array<Any ...

  3. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_9.RabbitMQ研究-工作模式-发布订阅模式-消费者

    消费者需要写两个消费者 定义邮件的类 复制以前的代码到邮件类里面进行修改 最上面 声明队列的名称和交换机的名称 监听修改为email 的队列的名称 手机短信接收端 复制一份email的接收端的代码 改 ...

  4. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_06-vuejs研究-vuejs基础-v-on指令

    3.v-on绑定一个按钮的单击事件 计算的按钮上加事件 点击计算的按钮,弹出的事件 定义一个Result的变量

  5. 服务器watchdog看门狗的理解

    1.什么是watchdog?watchdog,中文名称叫做“看门狗”,全称watchdog timer,从字面上我们可以知道其实它属于一种定时器.然而它与我们平常所接触的定时器在作用上又有所不同.普通 ...

  6. Qt 开源串口工具serialplot

    一.总结 serialplot,可视化很强大的串口收发工具.源代码:https://bitbucket.org/hyOzd/serialplot 1.serialplot用到了qwt插件,所以先安装好 ...

  7. 微信小程序 仿‘得到app’分类列表页

    今天另起一篇,贴出完整的代码,大概思路是左侧大分类列表,点击后联动右侧二级分类,及下面文章列表,点击二级分类也联动下面文章列表. 代码如下: <view class="page&quo ...

  8. django 之(二) --- 源码分析

    CBV类视图继承 CBV:继承自View:注册的时候使用的as_view() 入口 不能使用请求方法的名字作为参数的名字 只能接受已经存在的属性对应的参数 定义了一个view 创建了一个类视图对象 保 ...

  9. appium(api操作)

    driver.current_activity #获取当前activity driver.current_package #获取包名 driver.lock(seconds=2) #息屏 #收起虚拟键 ...

  10. 最新 苏宁java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.苏宁等10家互联网公司的校招Offer,因为某些自身原因最终选择了苏宁.6.7月主要是做系统复习.项目复盘.LeetCode ...