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实现针对中文排序的方法
May 09 Python
Python win32com 操作Exce的l简单方法(必看)
May 25 Python
利用python爬取斗鱼app中照片方法实例
Dec 03 Python
python使用mysql的两种使用方式
Mar 07 Python
Python实现时钟显示效果思路详解
Apr 11 Python
Python3.x爬虫下载网页图片的实例讲解
May 22 Python
python使用插值法画出平滑曲线
Dec 15 Python
python构建基础的爬虫教学
Dec 23 Python
Python实现平行坐标图的两种方法小结
Jul 04 Python
基于Tensorflow使用CPU而不用GPU问题的解决
Feb 07 Python
python自动下载图片的方法示例
Mar 25 Python
Python实现中英文全文搜索的示例
Dec 04 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
简单的页面缓冲技术
2006/10/09 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
php之可变函数的实例详解
2017/09/13 PHP
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
2013/09/10 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
2018/01/18 jQuery
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
Python切片索引用法示例
2018/05/15 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
python 实现矩阵按对角线打印
2019/11/29 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
市场营销战略计划书
2014/05/06 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
单位租车协议书
2015/01/29 职场文书
明星邀请函
2015/02/02 职场文书
2015年维修电工工作总结
2015/04/25 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
师范生见习总结范文
2015/06/23 职场文书
redis哨兵常用命令和监控示例详解
2021/05/27 Redis
MySQL提取JSON字段数据实现查询
2022/04/22 MySQL