特点

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

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

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

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

使用

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

 

2.编写中间件程序代码

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

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函数(如果是最后一个中间件)。

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

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列表 中注册自定义中间件模块

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对象

def process_exception(request,exception):
pass

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

def process_template_response(request, response):
pass

实例应用

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

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关闭的情况下看到错误信息

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())

  

 

Django边学边记——中间件的更多相关文章

  1. Django边学边记—模板

    功能 产生html,且不仅仅是一个html 包含: 静态内容:html,css,js 动态内容:模板语言 使用 一般使用 Django中提供的简写函数render调用模板 render(request ...

  2. Django边学边记—静态文件

    概念 项目中的CSS.图片.js都是静态文件 一般会将静态文件放到一个单独的目录中,以方便管理 在html页面中调用时,也需要指定静态文件的路径,Django中提供了一种解析的方式配置静态文件路径 静 ...

  3. Django边学边记—视图

    一. url (一)配置 在项目/settings.py中通过ROOT_URLCONF指定url配置 ROOT_URLCONF = 'XXXX.urls' 打开 项目/urls.py 配置 (二)语法 ...

  4. Django边学边记—模型查询

    查询集 两大特性 惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代.序列化.与if合用 缓存:查询集的结果被存下来之后,再次查询时会使用之前缓存的数据 返回列 ...

  5. Django边学边记—新手Django建项目各流程细节

    一.准备虚拟环境 1)安装 virtualenv pip install virtualenv 2)virtualenvwrapper pip install virtualenvwrapper-wi ...

  6. Django边学边记--状态保持(cookie和session)

    Cookie 概念: Cookie,也叫Cookies,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密),好比会员卡或餐票. 特点: Cookie是由服务 ...

  7. 9.25中间件和Django的学过的知识总结

    2018-9-25 12:10:54 参考连接:http://www.cnblogs.com/liwenzhou/p/8761803.html 浏览器访问Django的过程 面试时容易问到   Dja ...

  8. django系列8.2--django的中间件流程

    Django请求流程图 请求到达中间件之后,先按照正序执行每个注册中间件的process_reques方法,process_request方法返回的值是None,就依次执行,如果返回的值是HttpRe ...

  9. django系列8.1--django的中间件01 自定义中间件的5个方法

    一.Django中的中间件 Django中间件定义: Middleware is a framework of hooks into Django's request/response process ...

随机推荐

  1. FTP三种访问模式

    FTP匿名访问模式是比较不安全的服务模式,尤其在真实的工作环境中千万不要存放敏感的数据,以免泄露. vsftpd程序默认已经允许匿名访问模式,我们要做的就是开启匿名用户的上传和写入权限,写入下面的参数 ...

  2. 一种简易但设计全面的ID生成器思考

    分布式系统中,全局唯一 ID 的生成是一个老生常谈但是非常重要的话题.随着技术的不断成熟,大家的分布式全局唯一 ID 设计与生成方案趋向于趋势递增的 ID,这篇文章将结合我们系统中的 ID 针对实际业 ...

  3. Blazor Server 应用程序中进行 HTTP 请求

    翻译自 Waqas Anwar 2021年5月4日的文章 <Making HTTP Requests in Blazor Server Apps> [1] Blazor Server 应用 ...

  4. SQL 练习9

    查询学过「张三」老师授课的同学的信息 SELECT Student.* from Student,Teacher,Course,SC WHERE Teacher.TId = Course.TId AN ...

  5. 题解 [HNOI2008]GT考试

    传送门 这题暴力对拍都难搞,差评 一般的题解里思路是考虑一般DP: 令\(dp[i][j]\)为枚举到第i位时匹配到第j位的方案数,令\(g[k][j]\)为将匹配到k位的情况补到匹配到j位的方案数 ...

  6. flutter查看安全码SHA1

    最近flutter技术调研高德地图插件时,要用到安全码,可以打开cmd,键入一下命令查看.(注意路径用户名yourusernamehere改为自己的) keytool -list -v -keysto ...

  7. .NET Core垃圾收集

    在本章中,我们将介绍垃圾收集的概念,垃圾收集是.NET托管代码平台最重要的特性之一. 垃圾收集器(GC)管理内存的分配和释放. 垃圾收集器用作自动内存管理器. 我们不需要知道如何分配和释放内存或管理使 ...

  8. ThreadLocal, volatile, synchronized, map, epoll, AQS简单总结

    ThreadLocal ThreadLocal主要是为了解决内存泄漏的问题,它是一种弱引用: 引用总共有四种,,我简单列一下: 强引用(Strong Reference):正常引用,根据垃圾回收算法, ...

  9. Hibernate的一级缓存和二级缓存

    Fist level cache: This is enabled by default and works in session scope. Read more about hibernate f ...

  10. Linux centos 安装 jenkins & 本地构建jar & 远程构建jar

    一.部署 jenkins 需要的前奏 1.安装 JDK:https://www.cnblogs.com/chuyi-/p/10644440.html 2.安装tomcat:https://www.cn ...