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之重回函数
Oct 10 Python
Python列表生成器的循环技巧分享
Mar 06 Python
python中引用与复制用法实例分析
Jun 04 Python
Python中unittest模块做UT(单元测试)使用实例
Jun 12 Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
Apr 05 Python
一百多行python代码实现抢票助手
Sep 25 Python
python 抓包保存为pcap文件并解析的实例
Jul 23 Python
Django 创建新App及其常用命令的实现方法
Aug 04 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
python中利用matplotlib读取灰度图的例子
Dec 07 Python
Django搭建项目实战与避坑细节详解
Dec 06 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
一个改进的UBB类
2006/10/09 PHP
php桌面中心(四) 数据显示
2007/03/11 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
PHP 验证登陆类分享
2015/03/13 PHP
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
一个基于jquery的图片切换效果
2010/07/06 Javascript
js判断变量是否未定义的代码
2020/03/28 Javascript
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
Canvas 制作动态进度加载水球详解及实例代码
2016/12/09 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
使用原生JS实现滚轮翻页效果的示例代码
2020/05/31 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
python正则表达式中的括号匹配问题
2014/12/14 Python
python模拟鼠标拖动操作的方法
2015/03/11 Python
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
selenium+python截图不成功的解决方法
2019/01/30 Python
tensorflow没有output结点,存储成pb文件的例子
2020/01/04 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
django ORM之values和annotate使用详解
2020/05/19 Python
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
公司部门司机岗位职责
2014/01/03 职场文书
产品设计开发计划书
2014/05/07 职场文书
幸福来敲门观后感
2015/06/04 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python
JS实现扫雷项目总结
2021/05/19 Javascript