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中__call__内置函数用法实例
Jun 04 Python
python web框架学习笔记
May 03 Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 Python
用matplotlib画等高线图详解
Dec 14 Python
Python 数据处理库 pandas 入门教程基本操作
Apr 19 Python
Python读取本地文件并解析网页元素的方法
May 21 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
python实现换位加密算法的示例
Oct 14 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
python3.7添加dlib模块的方法
Jul 01 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
基于ThinkPHP实现批量删除
2015/12/18 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
js打印纸函数代码(递归)
2010/06/18 Javascript
关于this和self的使用说明
2010/08/01 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
jQuery实现统计复选框选中数量
2014/11/24 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
vue中锚点的三种方法
2018/07/06 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
python合并文本文件示例
2014/02/07 Python
python difflib模块示例讲解
2017/09/13 Python
python实现用户管理系统
2018/01/10 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
Python3内置模块random随机方法小结
2019/07/13 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
通过代码实例了解Python sys模块
2020/09/14 Python
自荐信的五个重要部分
2013/10/29 职场文书
绩效专员岗位职责
2013/12/02 职场文书
建筑专业自荐信范文
2014/01/05 职场文书
学生安全教育材料
2014/02/14 职场文书
廉洁校园实施方案
2014/05/25 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
MySQL索引失效的典型案例
2021/06/05 MySQL
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js
Windows Server 2019 域控制器安装图文教程
2022/04/28 Servers