Django入门到放弃之中间件

简介: Django入门到放弃之中间件

1.Django 中间件作用

1

2

修改请求,即传送到 view 中的 HttpRequest 对象。

修改响应,即 view 返回的 HttpResponse 对象。

2.中间件五个方法

process_request☆

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

   1. process_request

        1. 执行时间

            在视图函数之前执行

        2. 参数

            request 和视图中的request是同一个

        3. 返回值

            返回None

            返回response对象  

                不执行后面中间的process_request方法和视图

                直接执行当前值中间件的process_response方法

        4. 执行顺序

            按照注册的顺序执行

 

process_request 方法有一个参数 request,这个 request 和视图函数中的 request 是一样的。

 

process_request 方法的返回值可以是 None 也可以是 HttpResponse 对象。

 

返回值是 None 的话,按正常流程继续走,交给下一个中间件处理。

返回值是 HttpResponse 对象,Django 将不执行后续视图函数之前执行的方法以及视图函数,直接以该中间件为起点,倒序执行中间件,且执行的是视图函数之后执行的方法。

process_request 方法是在视图函数之前执行的。

 

当配置多个中间件时,会按照 MIDDLEWARE中 的注册顺序,也就是列表的索引值,顺序执行。

 

不同中间件之间传递的 request 参数都是同一个请求对象。

 

代码示例:

from django.utils.deprecation import MiddlewareMixin

from django.shortcuts import render, HttpResponse

 

class MD1(MiddlewareMixin):

    def process_request(self, request):

       print("md1  process_request 方法。"id(request)) #在视图之前执行

process_view

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

    process_view

        1. 执行时间

            在视图函数之前,process_request之后执行

        2. 参数

            request 是 HttpRequest 对象。

            view_func 是 Django 即将使用的视图函数。

            view_args 是将传递给视图的位置参数的列表。

            view_kwargs 是将传递给视图的关键字参数的字典。

            view_args 和 view_kwargs 都不包含第一个视图参数(request)。

        3. 返回值

            返回  None 正常执行

            返回  response对象   不执行后面的process_view和视图,直接执行所有中间件的process_response方法

            返回 view_func(request)    Django 将不执行后续视图函数之前执行的方法,提前执行视图函数,然后再倒序执行视图函数之后执行的方法

            

        4。执行顺序

            按照注册的顺序执行

            

process_view 方法是在视图函数之前,process_request 方法之后执行的。

当最后一个中间件的 process_request 到达路由关系映射之后,返回到第一个中间件 process_view,然后依次往下,到达视图函数

 

代码示例:

class MD1(MiddlewareMixin):

    def process_request(self, request,callback,callback_args,callback_kwargs):

        #callback 就是视图函数

        #res = callback(request)

        print("md1  process_request 方法。"id(request)) #在视图之前执行

 

 

    def process_response(self,request, response): :#基于请求响应

        print("md1  process_response 方法!"id(request)) #在视图之后

        return response

 

 

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

        print("md1  process_view 方法!"#在视图之前执行 顺序执行

        #return view_func(request)

process_template_response

1

2

3

4

5

6

7

8

process_template_response(条件触发:视图返回的response有render方法)

    1. 执行时间

        在视图函数之后,process_response之前执行

    2. 参数

    3. 返回值

        返回 response对象

    4. 执行顺序

        按照注册的倒序执行,执行完所有的process_template_response方法后执行response.render方法

process_exception

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

process_exception(有条件触发:有错误才执行)

                1. 执行时间

                    在视图函数之后,process_response之前执行

                2. 参数

                    exception  错误对象

                3. 返回值

                    返回  None 不对错误进行处理,交给下一个中间件进行处理

                    返回  response对象  下一个中间的process_exception不执行,直接执行所有中间件的process_response方法

                4. 执行顺序

                    按照注册的倒序执行

                    

代码示例:

class MD1(MiddlewareMixin):

    def process_request(self, request):

        print("md1  process_request 方法。"id(request)) #在视图之前执行

 

    def process_response(self,request, response): :#基于请求响应

        print("md1  process_response 方法!"id(request)) #在视图之后

        return response

 

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

        print("md1  process_view 方法!"#在视图之前执行 顺序执行

        #return view_func(request)

 

 

    def process_exception(self, request, exception):#引发错误 才会触发这个方法

        print("md1  process_exception 方法!")

        # return HttpResponse(exception) #返回错误信息

process_response

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

process_response   

        1. 执行时间   

            在视图函数之后执行

        2. request, response

            request 和视图中的request是同一个

            response 返回的response对象

        3. 返回值

            返回response对象

        4. 执行顺序

            按照注册的倒序执行

代码示例:

class MD1(MiddlewareMixin):

    def process_request(self, request):

        print("md1  process_request 方法。"id(request)) #在视图之前执行

 

 

    def process_response(self,request, response): :#基于请求响应

        print("md1  process_response 方法!"id(request)) #在视图之后

        return response

以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。

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

3.间件方法的作用

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

process_request可以干什么?

    -写一个中间件,不管前端用什么编码,在requset.data中都有post的数据

    -频率限制(限制某个ip地址,一分钟只能访问5次)

    -登录认证(只要没登录,重定向到login路径)、

    -记录用户访问日志(ip,时间,访问路径)

    

process_response可以干什么?内部有response对象

    -统一给所有(某几个路径)加cookie

    -统一给所有(某几个路径)加响应头

    

process_view 路由匹配成功和视图函数执行之前执行(callback就是视图函数)

    def process_view(self, request, callback, callback_args, callback_kwargs):

            # print(callback)

            # print(callback_args)

            # print(callback_kwargs)

            #在调用函数前执行点什么

            res=callback(request)

            #在视图函数执行后做点什么 类似装饰器

            print("中间件1的process_view")

            return res   

    

process_exception 视图函数出错,会执行它(全局异常捕获)(记录日志,哪个ip地址,访问哪个路径,出的错)

    # 全局异常捕获,返回4开头的

    def process_exception(self, request, exception):

        print(exception)

        return render(request,'error.html')

4.中间件的执行流程

1

2

3

4

5

1、执行完所有的request方法 到达视图函数。

2、执行中间件的其他方法

3、经过所有response方法 返回客户端。

 

注意:如果在其中1个中间件里 request方法里 return了值,就会执行当前中间的response方法,返回给用户 然后 报错。。不会再执行下一个中间件。

5.自定义中间的步骤

1

2

3

4

5

6

7

8

-写一个类,继承MiddlewareMixin #from django.utils.deprecation import MiddlewareMixin

-里面写方法process_request等方法

-在setting中配置(注意,放在前和放在后)

    MIDDLEWARE = [

        ...

        'app01.mymiddle.MyMiddleware1',

        ...

    ]  


相关文章
|
5天前
|
Java API 数据库
Django:从入门到精通
【11月更文挑战第18天】Django是一个由Python编写的高级Web应用框架,以其简洁性、安全性和高效性而闻名。Django最初由Adrian Holovaty和Simon Willison于2003年开发,旨在简化Web应用的开发过程。作为一个开放源代码项目,Django迅速吸引了大量的开发者和用户,成为了Python Web开发领域的重要工具之一。
13 1
|
1月前
|
存储 Shell 数据库
Python编程--Django入门:用户账户(二)
Python编程--Django入门:用户账户(二)
|
1月前
|
存储 数据库 Python
Python编程--Django入门:用户账户(一)
Python编程--Django入门:用户账户(一)
|
1月前
|
中间件 Python
理解Django中间件及其应用实例
理解Django中间件及其应用实例
30 0
|
3月前
|
前端开发 关系型数据库 Python
Django入门到放弃之分页器
Django入门到放弃之分页器
|
3月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
194 0
|
3月前
|
开发框架 安全 数据库
解锁Django框架神秘面纱!从入门到实战,掌握这些技巧,让你的Web应用秒变高效神器!
【8月更文挑战第31天】Django 是 Python 的明星 Web 开发框架,以其高效、安全及可扩展性著称,适用于构建各类 Web 应用。本文从 Django 基础概念出发,介绍其 MTV 架构,涵盖模型(Model)、模板(Template)、视图(View)等核心组件,并通过示例代码展示实际应用。此外,还将探讨路由配置、管理界面及实战技巧,帮助读者全面掌握 Django,为高效 Web 开发打下坚实基础。
53 0
|
3月前
|
中间件 数据库连接 UED
Django中间件秘籍:如何用几行代码让你的应用变得超级强大?
【8月更文挑战第31天】中间件是Django框架的核心特性,位于视图与HTTP服务器之间,允许全局处理请求和响应,增强Web应用功能。通过实现`MiddlewareMixin`类的方法,如`process_request`和`process_response`,可以轻松实现请求预处理或响应后处理。中间件应用场景广泛,包括用户认证、CSRF防护和数据库连接管理等。创建并配置中间件需将其加入`settings.py`的`MIDDLEWARE`列表,顺序决定执行优先级。合理利用中间件能提高代码重用性和应用性能,带来更好的用户体验。
52 0
|
3月前
|
关系型数据库 MySQL 机器人
Django入门到放弃之数据库配置
Django入门到放弃之数据库配置
|
3月前
|
缓存 中间件 数据库
Django入门到放弃之缓存及信号机制
Django入门到放弃之缓存及信号机制