IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> ?Django边学边记——中间件? -> 正文阅读

[Python知识库]?Django边学边记——中间件?

特点

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,用于全局修改Django的输入或输出。

每个中间件组件负责做一些特定的功能。中间件全部注册在setting.py中的?MIDDLEWARE?列表中。

中间件是可调用的,它接受请求并返回响应,就像视图一样。

为了在于不同的阶段执行,对输入或输出进行干预,我们可以编写自己的中间件。

使用

1.在项目中创建一个中间件包>创建中间件py文件?

 

2.编写中间件程序代码

一般习惯于将中间件写成一个类 :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

class?SimpleMiddleware:

????def?__init__(self, get_response):

????????self.get_response?=?get_response

????????# 服务器启动时 调用一次写在这里的代码

????def?__call__(self, request):

????????# 处理请求之前? 执行写在这里的代码,相当于老版本的 process_request(request)

????????response?=?self.get_response(request)

????????# 视图处理后,返回浏览器前 执行这里的代码 相当于老版本的 process_response(request,response)

  

????????return?response

?????

????def?process_view(self,request,view_func,*args,**kwargs):

????????# 处理请求后,处理视图前,执行这里的代码

????????# 返回None或HttpResponse对象

????????pass  

每个自定义的中间件类 必须有_init__ 和 __call__ 两个方法,写法也比较固定。一般按照文档说明中的格式套用即可,只需在相应位置加上自己的控制代码。

get_response参数是必需的,这个参数指的是下一个中间件或者view函数(如果是最后一个中间件)。

中间件也可以被写成这样的函数(习惯用类):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

def?simple_middleware(get_response):

????# One-time configuration and initialization.

????def?middleware(request):

????????# Code to be executed for each request before

????????# the view (and later middleware) are called.

????????response?=?get_response(request)

????????# Code to be executed for each request/response after

????????# the view is called.

????????return?response

????return?middleware

3. 注册中间件模块

在项目setting.py 的MIDDLEWEAR列表 中注册自定义中间件模块

1

2

3

4

5

6

7

8

9

10

MIDDLEWARE?=?[

????'django.middleware.security.SecurityMiddleware',

????'django.contrib.sessions.middleware.SessionMiddleware',

????'django.middleware.common.CommonMiddleware',

????'django.middleware.csrf.CsrfViewMiddleware',

????'django.contrib.auth.middleware.AuthenticationMiddleware',

????'django.contrib.messages.middleware.MessageMiddleware',

????'django.middleware.clickjacking.XFrameOptionsMiddleware',

????'test.middleware.middleware.MyMd',

]

  

中间件顺序与分层

在请求阶段,在调用视图之前,Django 按照定义的顺序应用中间件?MIDDLEWARE,自顶向下。

你可以把它想象成一个多道门的房子:每个中间件类都是一个“门”,视图在房子的最中间。如果请求通过所有门(每一个调用?get_response?)到达房子最中间的视图,那么响应将在返回的过程中也要通过进来的所有门出去(以相反的顺序)。

如果其中一道门决定不让进,并返回响应而不调用get_response,那么这道门后面的门都不会看到请求或响应。响应将只通过请求传入的相同层返回。?

经典流程图如下:

其他中间件钩子

除前面讲到的,还有2种会用到的中间件方法:

1.异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象

1

2

def?process_exception(request,exception):

????pass

2.处理模板响应前:在每个请求上调用,返回实现了render方法的响应对象

1

2

def?process_template_response(request, response):

????pass

实例应用

1.实现每个IP向 /pw 开头的地址 最多请求5次

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

class?LimitIp:

????ip_dict?=?{}

????def?__init__(self, get_response):

????????self.get_response?=?get_response

????def?__call__(self, request):

????????tar_ip?=?request.META['REMOTE_ADDR']

????????if?request.path_info.startswith('/pw'):???????????

???????   count?=?self.ip_dict.get(tar_ip,?0)

???????   count?+=?1

???????  ?self.ip_dict[tar_ip]?=?count

???????  ?if?count >?5:

?????????  ???return?HttpResponse(f'你已经访问{count}次,超出访问限制')

????????response?=?self.get_response(request)

????????return?response

  

2.实现让有权限的管理员可以在DEBUG关闭的情况下看到错误信息

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import?sys

??

from?django.views.debug?import?technical_500_response

??

class?ExceptionMiddleware(object):

????def?__init__(self, get_response):

????????self.get_response?=?get_response

??

????def?__call__(self, request):

????????response?=?self.get_response(request)

????????return?response

??

????def?process_exception(self, request, exception):

????????if?request.user.is_admin:

????????????return?technical_500_response(request,?*sys.exc_info())

  

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-22 14:38:10  更:2021-09-22 14:39:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:00:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码