django如何自己创建一个中间件


Posted in Python onJuly 24, 2019

中间件是什么?

中间件是类似flask函数中钩子函数的东西。可以在请求视图函数前,或者视图函数响应后处理某些事情。中间件对全部视图都有效!

django如何自己创建一个中间件

中间件一般会有两个方法,process_request和process_response。分别用来处理请求到达视图函数前,到达视图函数后的事情。

编写一个自定义的中间件

我们可以根据业务需要自己编写一个中间件。在编写中间件前,你需要读一下django.utils.deprecation.MiddlewareMixin的源码。

class MiddlewareMixin(object):
  def __init__(self, get_response=None):
    self.get_response = get_response
    super(MiddlewareMixin, self).__init__()

  def __call__(self, request):
    response = None
    if hasattr(self, 'process_request'):
      response = self.process_request(request)
    if not response:
      response = self.get_response(request)
    if hasattr(self, 'process_response'):
      response = self.process_response(request, response)
    return response

方法名 作用 返回值 备注
__init__(self, get_response=None) 服务器启动(重启)时执行一次 --
process_request(self, request) 在视图执行之前调用 返回 `None`: 会执行视图 返回 `HttpResponse`: 不会再执行视图 --
process_response(self, request, response) 在视图执行完之后调用 必须返回HttpResponse对象 --

编写自定义的中间件:

class My_middleware(MiddlewareMixin):
  def __init__(self,get_response=None):
    super().__init__(get_response)

  def process_request(self,request):
    """
    视图函数前执行的,一旦这里有return将到达不了视图函数
    request是浏览器发过来的请求
    """
    print("视图函数执行前")

  def process_response(self,request,response):
    """
    视图函数后执行的
    request是浏览器发过来的请求
    response是视图函数返回的响应
    """
    print("视图函数执行后")

    # 因为你拿了视图函数的response,就算处理的业务与response无关也要返回response
    return response

中间件的注册

MIDDLEWARE = [
  ...
  'middlewares.My_middleware'  # 写上自己的路径
]

多个中间件的执行顺序

django如何自己创建一个中间件

!!!如果你定义了多个中间件,记得注意一下中间件摆在setting.py文件的位置:

  • 注册中间件设置是由上到下执行的,所以上面的中间件会先被注册
  • 对于视图函数执行前的process_request,先注册的中间件会先执行
  • 对于视图函数执行后的process_response,后注册的中间件会先执行

例如:

先注册中间件1,后注册中间件2。

输出结果是:

before 视图(中间件1)
before 视图 2(中间件2)
==index==
after 视图 2(中间件2)
after 视图(中间件1)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的直接插入排序算法示例
Apr 29 Python
详解python中的json和字典dict
Jun 22 Python
完美解决在oj中Python的循环输入问题
Jun 25 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
Numpy的简单用法小结
Aug 28 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
Dec 09 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
pytorch实现CNN卷积神经网络
Feb 19 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 Python
Python的这些库,你知道多少?
Jun 09 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 Python
django如何通过类视图使用装饰器
Jul 24 #Python
django 类视图的使用方法详解
Jul 24 #Python
django如何实现视图重定向
Jul 24 #Python
python字符串分割及字符串的一些常规方法
Jul 24 #Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 #Python
python 判断三个数字中的最大值实例代码
Jul 24 #Python
Django Celery异步任务队列的实现
Jul 24 #Python
You might like
php入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
PHP中Array相关函数简介
2016/07/03 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
Prototype Object对象 学习
2009/07/12 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
2016/06/08 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
AngularJs ng-change事件/指令的用法小结
2017/11/01 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
Python Property属性的2种用法
2015/06/21 Python
Python实现二维有序数组查找的方法
2016/04/27 Python
Sanic框架路由用法实例分析
2018/07/16 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
2020/02/26 Python
Python进程间通信multiprocess代码实例
2020/03/18 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
Python如何使用正则表达式爬取京东商品信息
2020/06/01 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
《狼》教学反思
2014/03/02 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
文艺演出主持词
2015/07/01 职场文书
Python标准库之typing的用法(类型标注)
2021/06/02 Python
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python
关于python类SortedList详解
2021/09/04 Python
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
python turtle绘图
2022/05/04 Python