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内置函数dir详解
Apr 14 Python
Python 专题二 条件语句和循环语句的基础知识
Mar 19 Python
Python实现基本数据结构中栈的操作示例
Dec 04 Python
python实现百度语音识别api
Apr 10 Python
Python生成rsa密钥对操作示例
Apr 26 Python
使用pyecharts生成Echarts网页的实例
Aug 12 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
Oct 24 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
Mar 13 Python
Python OpenCV实现测量图片物体宽度
May 27 Python
如何使用Cython对python代码进行加密
Jul 08 Python
python 星号(*)的多种用途
Sep 21 Python
python爬虫用request库处理cookie的实例讲解
Feb 20 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 Undefined index和Undefined variable的解决方法
2008/03/27 PHP
php二维数组排序方法(array_multisort usort)
2013/12/25 PHP
php按字符无乱码截取中文的方法
2015/03/27 PHP
twig模板常用语句实例小结
2016/02/04 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
Python制作exe文件简单流程
2019/01/24 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
python调用自定义函数的实例操作
2019/06/26 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
python 实现识别图片上的数字
2019/07/30 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
护理中职生求职信范文
2014/02/24 职场文书
百货商场楼层班组长竞聘书
2014/03/31 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
玄武湖导游词
2015/02/05 职场文书
教师党员自我评价范文
2015/03/04 职场文书
工作年限证明模板
2015/06/15 职场文书
创业计划书之酒店
2019/08/30 职场文书
Vue图片裁剪组件实例代码
2021/07/02 Vue.js
利用Java连接Hadoop进行编程
2022/06/28 Java/Android