刘沙河 刘沙河
首页
  • Go语言基础

    • 数据类型
    • 反射
    • Go指针
  • Go语言进阶

    • go泛型
    • go条件编译
    • cgo教程
    • Go协程调度原理及GPM模型
    • Go内存管理
    • Go垃圾回收机制
    • Go语言内存对齐
  • Go语言实现原理

    • channel 实现原理
    • slice 实现原理
    • map 实现原理
    • sync.Mutex 实现原理
    • 乐观锁CAS 实现原理
    • singlefight 实现原理
  • gin框架

    • gin中间件原理
    • gin路由原理
  • gorm

    • GORM介绍和使用
    • GORM_CURD操作指南
  • go测试

    • benchmark基准测试
    • pprof 性能分析
  • python进阶

    • Numpy&Pandas
    • celery分布式任务队列
  • Django

    • Django 常见命令
    • middleware中间件
    • Django缓存系统
    • Django信号系统
    • Django REST Framework
  • Flask

    • Flask基础知识总结
    • Flask-SQLAlchemy
  • 爬虫

    • aiohttp
    • scrapy框架
  • Mysql

    • Mysql存储引擎和索引
    • MySQL主从复制
    • Mysql读写分离
    • 数据库分库分表
    • Mysql锁
    • Mysql事务和MVCC原理
    • 分库分表带来的读扩散问题
  • Redis

    • redis基础和数据类型
    • redis主从架构
    • redis哨兵架构
    • redis集群模式
    • 如何保证缓存和数据库双写一致
    • redis底层数据结构
    • redis分布式锁
  • Elasticsearch

    • es基本概念
    • es基础语法
    • es倒排索引
  • etcd

    • Go操作etcd
    • Raft原理
    • etcd分布式锁
  • kafka

    • 消息队列MQ总结
    • kafka 概述及原理
    • kafka 消费问题记录
    • 零拷贝技术
    • kafka分区规范
  • RabbitMQ

    • rabbitMQ基础
    • Go操作rabbitmq
  • RocketMQ

    • 可靠消息队列 rocketMQ
  • Http&Https

    • http&https
    • TCP和UDP
    • Ping 原理
  • RPC

    • RPC初识
    • grpc初识和实现
  • gRPC

    • grpc 初识
    • grpc 上下文 metadata
    • grpc 健康检查
    • grpc keepalive
    • grpc 命名解析
    • grpc 中间件&拦截器
    • grpc 负载均衡
    • grpc 身份认证
    • grpc 超时重试
    • grpc 链路追踪
    • grpc-gw将gRPC转RESTfu api
    • grpc-gw自定义选项
  • protobuf

    • protobuf 进阶
    • protobuf 编码原理
  • Docker

    • Docker基础
    • Docker常用命令
    • Dockerfile
    • Docker-Compose
    • Docker多阶段构建
    • Docker Config 教程
    • Docker Swarm 教程
    • Docker Stack 教程
    • Docker Buildx 教程
  • k8s

    • k8s 基础概念
    • k8s 集群架构
    • k8s 工作负载
    • Pod 网络
    • Service 网络
    • 外部接入网络
    • 一张图搞懂k8s各种pod
    • k8s 存储抽象
    • mac快速启动k8s
    • 自制申威架构k8s-reloader
  • go-kit

    • go-kit初识
    • go-kit启动http服务
    • go-kit集成gin启动服务
    • go-kit集成grpc和protobuf
    • go-kit中间件
    • go-kit服务注册发现与负载均衡
    • go-kit限流和熔断
    • go-kit链路追踪
    • go-kit集成Prometheus
  • 设计模式

    • 初识设计模式
    • 创建型模式
    • 结构型模式
    • 行为模式
  • 数据结构

    • 时间轮
    • 堆、双向链表、环形队列
    • 队列:优先队列
    • 队列:延迟队列
  • 算法

    • 递归算法
    • 枚举算法
    • 动态规划
    • 回溯算法
    • 分治算法
    • 贪心算法
    • LRU和LFU
    • 一致性哈希

花开半夏,半夏花开
首页
  • Go语言基础

    • 数据类型
    • 反射
    • Go指针
  • Go语言进阶

    • go泛型
    • go条件编译
    • cgo教程
    • Go协程调度原理及GPM模型
    • Go内存管理
    • Go垃圾回收机制
    • Go语言内存对齐
  • Go语言实现原理

    • channel 实现原理
    • slice 实现原理
    • map 实现原理
    • sync.Mutex 实现原理
    • 乐观锁CAS 实现原理
    • singlefight 实现原理
  • gin框架

    • gin中间件原理
    • gin路由原理
  • gorm

    • GORM介绍和使用
    • GORM_CURD操作指南
  • go测试

    • benchmark基准测试
    • pprof 性能分析
  • python进阶

    • Numpy&Pandas
    • celery分布式任务队列
  • Django

    • Django 常见命令
    • middleware中间件
    • Django缓存系统
    • Django信号系统
    • Django REST Framework
  • Flask

    • Flask基础知识总结
    • Flask-SQLAlchemy
  • 爬虫

    • aiohttp
    • scrapy框架
  • Mysql

    • Mysql存储引擎和索引
    • MySQL主从复制
    • Mysql读写分离
    • 数据库分库分表
    • Mysql锁
    • Mysql事务和MVCC原理
    • 分库分表带来的读扩散问题
  • Redis

    • redis基础和数据类型
    • redis主从架构
    • redis哨兵架构
    • redis集群模式
    • 如何保证缓存和数据库双写一致
    • redis底层数据结构
    • redis分布式锁
  • Elasticsearch

    • es基本概念
    • es基础语法
    • es倒排索引
  • etcd

    • Go操作etcd
    • Raft原理
    • etcd分布式锁
  • kafka

    • 消息队列MQ总结
    • kafka 概述及原理
    • kafka 消费问题记录
    • 零拷贝技术
    • kafka分区规范
  • RabbitMQ

    • rabbitMQ基础
    • Go操作rabbitmq
  • RocketMQ

    • 可靠消息队列 rocketMQ
  • Http&Https

    • http&https
    • TCP和UDP
    • Ping 原理
  • RPC

    • RPC初识
    • grpc初识和实现
  • gRPC

    • grpc 初识
    • grpc 上下文 metadata
    • grpc 健康检查
    • grpc keepalive
    • grpc 命名解析
    • grpc 中间件&拦截器
    • grpc 负载均衡
    • grpc 身份认证
    • grpc 超时重试
    • grpc 链路追踪
    • grpc-gw将gRPC转RESTfu api
    • grpc-gw自定义选项
  • protobuf

    • protobuf 进阶
    • protobuf 编码原理
  • Docker

    • Docker基础
    • Docker常用命令
    • Dockerfile
    • Docker-Compose
    • Docker多阶段构建
    • Docker Config 教程
    • Docker Swarm 教程
    • Docker Stack 教程
    • Docker Buildx 教程
  • k8s

    • k8s 基础概念
    • k8s 集群架构
    • k8s 工作负载
    • Pod 网络
    • Service 网络
    • 外部接入网络
    • 一张图搞懂k8s各种pod
    • k8s 存储抽象
    • mac快速启动k8s
    • 自制申威架构k8s-reloader
  • go-kit

    • go-kit初识
    • go-kit启动http服务
    • go-kit集成gin启动服务
    • go-kit集成grpc和protobuf
    • go-kit中间件
    • go-kit服务注册发现与负载均衡
    • go-kit限流和熔断
    • go-kit链路追踪
    • go-kit集成Prometheus
  • 设计模式

    • 初识设计模式
    • 创建型模式
    • 结构型模式
    • 行为模式
  • 数据结构

    • 时间轮
    • 堆、双向链表、环形队列
    • 队列:优先队列
    • 队列:延迟队列
  • 算法

    • 递归算法
    • 枚举算法
    • 动态规划
    • 回溯算法
    • 分治算法
    • 贪心算法
    • LRU和LFU
    • 一致性哈希
  • Python基础

  • Python进阶

  • Python并发编程

  • Django

    • django 常见命令
    • Django模板母版
    • Django视图
    • Django路由系统
    • Django--orm系统-指令&属性
    • Django--orm系统 -分组聚合
    • Django-cookie&session
    • middleware中间件
      • 1.中间件定义的五个方法:
        • 1.1 process_request
        • 特征
        • 1.2 process_response
        • 特征
        • 1.3 process_view
        • 特征
        • 1.4process_exception
        • 特征
        • 1.5processtemplateresponse
        • 特征
      • 2.完整的django请求的生命周期
        • 内容回顾
        • http协议
        • 路由
        • ORM
        • 模板
        • cookie session
        • ajax
        • form
        • 中间件
    • Django 的身份认证系统
    • Django models 之字段详解
    • Django缓存系统
    • Django数据库系统
    • Django信号系统
    • Django序列化和反序列化
    • Django中admin用法
    • DRF 版本、认证、权限、限制、解析器和渲染器
    • DRF(Django REST Framework)框架
  • Flask

  • 爬虫

  • Python
  • Django
bigox
2021-03-22
目录

middleware中间件

参考博客https://www.cnblogs.com/maple-shaw/articles/9333824.html

  • 中间件是处理django的请求和响应的框架级别的钩子,本质是一个类(直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作)

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

  • 定义的中间件需要注册

  • django中请求响应流程

    ![1561798819879](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1561798819879.png)

# 1.中间件定义的五个方法:

  • process_request(self,request)
  • process_response(self, request, response)
  • process_view(self, request, view_func, view_args, view_kwargs)
  • process_exception(self, request, exception)
  • process_template_response(self,request,response)

------最好全记住!!!!!!!!!!!!

# 1.1 process_request

  • process_request(self,request)

# 特征

在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行

  1. 执行时间: 在执行视图函数之前执行

  2. 参数: request

    • request和视图函数中的的request是一个对象
  3. 执行顺序:

    • 按照注册的顺序进行执行
  4. 返回值:

    • 返回值为none的时候,执行顺序正常
    • 返回值如果是HttpResponse, 后面的中间件的process_request、视图函数都不执行,直接执行当前中间件中的process_response方法,再倒序执行之前的中间件中process_response方法。

# 1.2 process_response

  • process_response(self, request, response)

# 特征

在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行

  1. 执行时间: 在执行视图函数之后执行
  2. 参数: request / response
    • request 和视图函数中的的request是一个对象
    • response 返回给浏览器响应对象(不一定是视图对象,peocess_request也会返回对象)
  3. 执行顺序:
    • 按照注册的顺序,倒序执行
  4. 返回值:
    • ​ HttpResponse:必须返回response对象
  • process_request执行流程

    ![1561802908112](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1561802908112.png)

# 1.3 process_view

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

# 特征

在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行

  1. 执行时间: 视图函数之前,process_request之后

  2. 参数: request

    • request 和视图函数中的的request是一个对象
    • view_func 视图函数
    • view_args 视图函数的位置参数
    • view_kwargs 视图函数的关键字参数
  3. 执行顺序:

    • 按照注册的顺序进行执行
  4. 返回值:

    • 返回值为none的时候, 执行顺序正常
    • 返回值如果是HttpResponse, 后面的中间的process_view、视图函数都不执行,直接执行注册的最后一个中间件中的process_response方法,再倒叙执行之前的中间中process_response方法。
  • 执行流程图

    ![1561802700654](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1561802700654.png)

# 1.4process_exception

  • process_exception(self, request, exception)

# 特征

在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行

  1. 执行时间((触发条件)): 视图函数之后,视图层面有错时才执行

  2. 参数: request/exception

    • request 和视图函数中的的request是一个对象
    • exception 视图中的错误对象
  3. 执行顺序:

    • 按照注册的顺序 倒叙执行
  4. 返回值:

    • 返回值为none的时候, 交给下一个中间件取处理异常,都没有处理交由django处理异常
    • 返回值如果是HttpResponse, 后面的中间件的process_exception不执行,直接执行最后一个中间件中的process_response方法,倒叙执行之前的中间中process_response方法。
  • 流程图

    ![1561801490783](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1561801490783.png)

# 1.5process_template_response

  • process_template_response(self,request,response)

# 特征

在视图函数之前执行的中间件方法按照注册顺序执行,在视图函数之后执行的中间件方法按照注册顺序倒序执行

  1. 执行时间((触发条件)): 视图函数之后,视图返回的是一个templateResponse对象(跟render用法类似)

  2. 参数: ,request,response

    • request 和视图函数中的的request是一个对象
    • response templateResponse对象
  3. 执行顺序:

    • 按照注册的顺序 倒叙执行
  4. 返回值:

    • HttpResponse:必须返回response对象
  • 流程图

    ![1561802461972](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1561802461972.png)

# 2.完整的django请求的生命周期

![1561862049120](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1561862049120.png)

django小结

# 内容回顾

web框架 socket服务端

# http协议

请求的格式

“请求方式 URL路径 协议版本HTTP/1.1\r\n

k1:v1\r\n

k1v2\r\n

\r\n

请求体(请求的数据)”

响应的格式

“HTTP/1.1 状态码 状态描述\r\n

k1:v1\r\n

k1v2\r\n

\r\n

响应体(HTML页面)”

头

contentType: text/html application/json

set-cookie cookie

Location

MVC MTV

# 路由

url 和 函数的对应关系

​ url(正则表达式,视图,{} ,name)

分组和命名分组

路由分发 include

url的命名和反向解析

namespace

视图 CBV FBV

request

response

# ORM

# 模板

# cookie session

# ajax

# form

# 中间件

#Python#
上次更新: 2023/04/16, 18:35:33
Django-cookie&session
Django 的身份认证系统

← Django-cookie&session Django 的身份认证系统→

最近更新
01
go与http代理
05-24
02
自制申威架构k8s-reloader
12-06
03
Docker Buildx 教程
12-01
更多文章>
Theme by Vdoing | Copyright © 2020-2024 小刘扎扎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式