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函数的5种参数详解
Feb 24 Python
Python实现简单过滤文本段的方法
May 24 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
numpy返回array中元素的index方法
Jun 27 Python
Python自定义一个类实现字典dict功能的方法
Jan 19 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
Aug 10 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
Oct 11 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
Python文件名匹配与文件复制的实现
Dec 11 Python
Django集成富文本编辑器summernote的实现步骤
May 31 Python
django 认证类配置实现
Nov 11 Python
Python学习之包与模块详解
Mar 19 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事务处理实例详解
2014/07/11 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
php微信开发之带参数二维码的使用
2016/08/03 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
javascript时间函数大全
2014/06/30 Javascript
AngularJS 模块详解及简单实例
2016/07/28 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
vue路由缓存的几种实现方式小结
2020/02/02 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
Python中的descriptor描述器简明使用指南
2016/06/02 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
python实现关键词提取的示例讲解
2018/04/28 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
Django实现文件上传和下载功能
2019/10/06 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
python小白学习包管理器pip安装
2020/06/09 Python
CSS3的RGBA中关于整数和百分比值的转换
2015/08/04 HTML / CSS
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
自荐书范文
2013/12/08 职场文书
勾股定理课后反思
2014/04/26 职场文书
政协调研汇报材料
2014/08/15 职场文书
2014年妇委会工作总结
2014/12/10 职场文书
入伍通知书
2015/04/23 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
python中如何对多变量连续赋值
2021/06/03 Python
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers