不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • python基础

  • python模块

  • django

    • 01_Django基础

      • 01.django介绍
      • 02.环境安装
      • 03.创建django项目
      • 04.路由配置
      • 05.请求与相应
      • 06.类视图
      • 07.中间件
        • 01.初识中间件
          • 1.1 什么是中间件
          • 1.2 中间件处理过程
          • 1.3 生命周期图解
        • 02.中间件使用
          • 2.1 创建存放中间件的文件夹
          • 2.2 settings.py中注册中间件
          • 2.3 写处理函数test
          • 2.4 定义中间件
      • 08.cookie
      • 09.session
    • 02_Model数据库操作

    • 03_DRF框架

    • 04_部署

  • flask

  • SYL

  • Celery

  • 微服务

  • python
  • django
  • 01_Django基础
xiaonaiqiang
2021-02-15
目录

07.中间件

# 01.初识中间件

# 1.1 什么是中间件

  • Django中间件是修改 Django request 或者 response 对象的钩子

  • 可以理解为是介于 HttpRequest 与 HttpResponse 处理之间的一道处理过程。

  • Django中间件作用:

    • 修改请求,即传送到 view 中的 HttpRequest 对象。
    • 修改响应,即 view 返回的 HttpResponse 对象。

# 1.2 中间件处理过程

  • 1、首先客户端发起请求,会将请求交给settings.py中排在最前面的中间件

  • 2、前面中间件收到请求会调用类中的process_request方法处理,然后交给下一个中间件的process_request函数

  • 3、到达最后一个中间件的process_request函数处理后会到达url路由系统

  • 4、然后从路由系统直接跳转到第一个中间件的process_view函数,依次向后面中间的process_view传递

    • 最后到达views.py处理函数,获取网页中的数据
  • 5、获取的数据会交给最后一个中间件的process_response方法处理,然后依次向前面的中间件process_response

    • 方法提交请求的内容,最后由最前面的中间件将请求数据返回到客户端
  • 6、在任一中间件的process_request和process_view方法中有返回值就会直接返回给process_response

# 1.3 生命周期图解

  • 1、首先会交给中间件,中间件处理后交给路由系统

  • 2、路由系统

    • 1:Django程序会到urls.py文件中找到对应请求的处理函数(视图函数)
  • 3、视图函数

    • 1:视图函数会找到对应的html模板文件
    • 2:然后到数据库中取得数据替换html模板中的内容
    • 3:使用static中的js和css文件结合对html渲染
    • 4:最后Django将最终渲染后的html文件返回给中间件
  • 4、中间件再调用process_response方法处理,最后交给用户

# 02.中间件使用

# 2.1 创建存放中间件的文件夹

    1. 在工程目录下创建任意目录,这里创建路径为: /project/middle/m1.py

# 2.2 settings.py中注册中间件

MIDDLEWARE = [
    'middle.m1.Row1',
    'middle.m1.Row2',
    'middle.m1.Row3',
]
1
2
3
4
5

# 2.3 写处理函数test

  • 在views.py文件中写处理函数test
def test(request):
    # int('fds')    #当views函数出现异常,中间件中的process_exception执行
    print('没带钱|')
    return HttpResponse('ok')
1
2
3
4

# 2.4 定义中间件

  • 在/project/middle/m1.py文件中定义中间件
from django.utils.deprecation import MiddlewareMixin

class Row1(MiddlewareMixin):
    def process_request(self,request):
        print('process_request_1')

    def process_view(self,request, view_func, view_func_args, view_func_kwargs):
        #view_func_args:   url中传递的非字典的值会用这个变量接收
        #view_func_kwargs: url中传递的字典会传递到这个变量接收(如:nid=1)
        print('process_view_1')

    def process_response(self,request, response):    #response就是拿到的返回信息
        print('response_1')
        return response

    def process_exception(self, request, exception):
        '''只有当views函数中异常这个函数才会执行'''
        if isinstance(exception, ValueError):
            return HttpResponse('>>出现异常了')

        
class Row2(MiddlewareMixin):
    def process_request(self,request):
        print('process_request_2')
        #1 如果在Row2中的process_request中有返回值,那么就不会到达Row3
        #2 Row2直接将返回值交给自己的process_response再交给Row1的process_response
        #3 最后客户端页面显示的就是‘走’请求没机会到达views函数,不会打印‘没带钱’
        # return HttpResponse('走')

    def process_view(self,request, view_func, view_func_args, view_func_kwargs):
        print('process_view_2')

    def process_response(self,request, response):
        print('response_2')
        return response

    
class Row3(MiddlewareMixin):
    def process_request(self,request):
        print('process_request_3')

    def process_view(self,request, view_func, view_func_args, view_func_kwargs):
        print('process_view_3')

    def process_response(self,request, response):
        print('response_3')
        return response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
上次更新: 2024/3/13 15:35:10
06.类视图
08.cookie

← 06.类视图 08.cookie→

最近更新
01
04.数组双指针排序_子数组
03-25
02
08.动态规划
03-25
03
06.回溯算法
03-25
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式