Django 详解 中间件Middleware
Django中间件
还是涉及到django的请求生命周期。middle ware 请求穿过中间件到达url,再经过中间件返回给用户。
简单实例
django项目根目录新建一个Middle文件夹,再新建一个test.py文件
在test文件中写入;其中的类必须继承 from django.utils.deprecation import MiddlewareMixin
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
def process_request(self, request):
print('m1')
def process_response(self, request, response):
print('m1_r')
return response class M2(MiddlewareMixin):
def process_request(self, request):
print('m2')
def process_response(self, request, response):
print('m2_r')
return response class M3(MiddlewareMixin):
def process_request(self, request):
print('m3') def process_response(self, request, response):
print('m3_r')
return response
将你的测试中间件加入Django的中间件配置中,settings文件
随便建一组对应路由。
在index函数里面写上
def index(request):
print('到达')
return HttpResponse('ok')
查看结果:
此时如果给某个中间件的process_request返回一个HttpResponse:
#!/user/bin/env python
# -*-coding: utf-8-*-
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class M1(MiddlewareMixin):
def process_request(self, request):
print('m1')
def process_response(self, request, response):
print('m1_r')
return response class M2(MiddlewareMixin):
def process_request(self, request):
print('m2')
return HttpResponse('中断') # 这里返回
def process_response(self, request, response):
print('m2_r')
return response class M3(MiddlewareMixin):
def process_request(self, request):
print('m3') def process_response(self, request, response):
print('m3_r')
return response
查看下结果
可能你好像懂了,但是并没有,真正的中间件过程其实还有一个process_view.
自定制中间件的另一种方式
下面是最新的django2.1文档内的自定制中间件的另一种写法。
一个中间件工厂是可以被调用的,它接收一个可调用的get_response方法并返回一个中间件。中间件也是可调用的,它接收请求并返回响应,就像一个view视图
def simple_middleware(get_response):
# 一次性配置和初始化 def middleware(request):
# 在每个请求之前被执行的代码
#这个视图(和后面的中间件)被调用 response = get_response(request) # 在每个请求或者响应之后代码被执行
# the view is called. return response return middleware
或者他也可以被重写成一个实例可以被调用的类,像这个:
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# 一次性配置和初始化 def __call__(self, request):
# 在每一次请求之前代码被执行
# 视图或者接下来的中间件被调用
response = self.get_response(request) # 在每个请求或者响应之后代码将会被执行
# the view is called. return response
可调用的get_response是由django提供的,可以是真实的视图函数或者也可以是链上的下一个中间件。当前的中间件不需要具体精确地知道或者关心它是什么,只是它代表接下来执行(到来的)是什么。
上面是一个小小的简化,可调用的get_response如果在中间件的最后一位,将不会是一个真实的视图函数,更可能是处理的一个外部包装方法,它关注于应用视图中间件,调用视图和合适的URL参数,并且使用template和exception中间件.
中间件可以生存在你的Python路径的任何地方。
__init__(get_response)
中间件工厂必须接收一个get_response参数,你也可以为中间件初始化一些全局的状态。记住下面的这几点
1、django只能使用get_response参数来初始化你的中间件,所以你不能定义__init__()来需要其他的参数
2、跟__call__()方法每次请求被调用不同,__init__()方法只会被调用一次,当web服务启动的时候
例如
class LoginMiddleware:
def __init__(self, get_response):
self.get_response = get_response @method_decorator(adminlogin)
def __call__(self, request):
if request.method == "PUT":
request.data = dict(urllib.parse.parse_qsl(request.body.decode()))
request.data.update(request.GET.dict())
elif request.method == "POST":
request.data = request.POST.copy().dict()
response = self.get_response(request)
return response
def performance(func):
def wrapper(request):
mark1 = time.time()
start = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(mark1)) # 2018-09-28 03:42:08
response = func(request)
if response.status_code == 200 and request.path.split('/')[1] == 'api': # api url& response success
mark2 = time.time()
cost = mark2 - mark1
end = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(mark2))
note = 'url: %s |%s | total cost: %s | start time: %s | end time: %s\r\n' % (request.path, request.GET, cost, start, end) with open(performance_file, 'a+') as obj:
obj.write(note)
return response
return wrapper class PerformanceMiddleware:
def __init__(self, get_response):
self.get_response = get_response @method_decorator(performance)
def __call__(self, request):
response = self.get_response(request)
return response
详情请查阅django(version2.1)文档:https://docs.djangoproject.com/en/2.1/topics/http/middleware/
Django 详解 中间件Middleware的更多相关文章
- Python 19 Django 详解
本节概要 Django详解 前言 有一部分原因是,确实djando的课程有点多:并且,最近又在研究利用python做数据分析时间上耽误了.所以楼主讲所有的课程全部重新观看了一遍,再来撰写博客,其实说起 ...
- 【laravel54】详解中间件
1.中间件定义:对http请求进行一层过滤,通过过滤才能继续执行请求 2.中间件方法handle方法参数详解: 其中参数的形式可以有多个,使用[,]进行分割. 3.路由中使用中间件: 3.1 中间件使 ...
- Django框架之中间件MiddleWare
Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健 ...
- Django 学习之中间件Middleware
一.中间件介绍 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响 ...
- Django 详解 信号Signal
Django信号 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. Model signals pre_init # ...
- Django详解之models操作
D jango 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.p ...
- Django详解之四、cookie和session
一.使用背景 思路 简单的后台管理:对人员的管理 1. 登录注册 2. 老师 班级管理 学院管理 3. 增删改查 开发: 1. 定义数据库表结构 a) 表结构关系 i. class classes(m ...
- Django 详解<二> 之url和view
Django URL(路由系统) RL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对 ...
- Django 详解
Django是一个开源的Web应用框架,由Python写成.采用MVC的软件设计模式,主要目标是使得开发复杂的.数据库驱动的网站变得简单.Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法 ...
随机推荐
- sprintf() 处理 float类型的数字,保留小数位等。
关于 sprintf()的百科地址: http://baike.baidu.com/view/1295144.htm sprintf(szText, "%[填空字元][宽度][.精度]f&q ...
- 激活函数(ReLU, Swish, Maxout)
神经网络中使用激活函数来加入非线性因素,提高模型的表达能力. ReLU(Rectified Linear Unit,修正线性单元) 形式如下: \[ \begin{equation} f(x)= \b ...
- Java实现二叉树的前序、中序、后序、层序遍历(递归方法)
在数据结构中,二叉树是树中我们见得最多的,二叉查找树可以加速我们查找的效率,那么输出一个二叉树也变得尤为重要了. 二叉树的遍历方法分为四种,分别为前序遍历.中序遍历.后序.层序遍历.下图即为一 ...
- nginx配置模板问题404
nginx配置模板问题 一.nginx主配置文件如下 cat /etc/nginx/nginx.conf user nginx; worker_processes ; #error_log logs/ ...
- sql server开发工具
查询分析器的使用 SQL语言包含四个部分: 1.数据定义语言(DDL) : 例如 create, drop, alter等语句 2.数据操作语言(DML) : 例如 insert,delete, up ...
- Spring Boot笔记八:表单验证
所谓的表单验证,就是为了防止用户乱输入的,这个问题前端的HTML5就可以判断了,其实不需要后端来验证,这里还是讲一下后端验证 首先,我们的Person类,我们加上一些表单验证的注释,如下: packa ...
- 开源实时消息推送系统 MPush
系统介绍 mpush,是一款开源的实时消息推送系统,采用java语言开发,服务端采用模块化设计,具有协议简洁,传输安全,接口流畅,实时高效,扩展性强,可配置化,部署方便,监控完善等特点.同时也是少有的 ...
- 3、JPA-API
Persistence Persistence 类用于获取 EntityManagerFactory 实例,该类包含一个名为 createEntityManagerFactory 的静态方法 . cr ...
- 阿里云申请ssl证书配置tomcat访问https
首先去阿里云上面申请ssl证书,免费的,自己百度去. 申请完ok之后会让你下载一个压缩包,里面有四个文件. 在tomcat安装目录下创建cert文件夹,把这四个文件扔进去 在conf/server.x ...
- VirtualBox安装Ubuntu14.04
创建虚拟机 点击 新建(N) 设置虚拟机的名称,类型与版本,如下图所示: 分配虚拟机的内存大小,受PC实际内存影响,暂时设置为2G,如下图所示: 分配虚拟机的硬盘大小,默认即可,如下图所示: 分配虚拟 ...