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使用scrapy采集时伪装成HTTP/1.1的方法
Apr 08 Python
python实现的DES加密算法和3DES加密算法实例
Jun 03 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
Mar 19 Python
利用python的socket发送http(s)请求方法示例
May 07 Python
python贪吃蛇游戏代码
Apr 18 Python
只需7行Python代码玩转微信自动聊天
Jan 27 Python
Python基础之文件读取的讲解
Feb 16 Python
django连接mysql数据库及建表操作实例详解
Dec 10 Python
python实现监控阿里云账户余额功能
Dec 16 Python
使用python实现希尔、计数、基数基础排序的代码
Dec 25 Python
Python3批量创建Crowd用户并分配组
May 20 Python
python ConfigParser库的使用及遇到的坑
Feb 12 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框架设计及扩展详解
2014/11/25 PHP
php实现复制移动文件的方法
2015/07/29 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
php跨域调用json的例子
2013/11/13 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
js模块加载方式浅析
2017/08/12 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
Python编写登陆接口的方法
2017/07/10 Python
python 搜索大文件的实例代码
2019/07/08 Python
Django项目使用CircleCI的方法示例
2019/07/14 Python
Python 如何反方向迭代一个序列
2020/07/28 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
JPA的优势都有哪些
2013/07/04 面试题
科学育儿宣传标语
2014/10/08 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
美丽人生观后感
2015/06/03 职场文书
雷锋观后感
2015/06/10 职场文书
我是特种兵观后感
2015/06/11 职场文书
《社戏》教学反思
2016/02/22 职场文书
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js
详解Python中下划线的5种含义
2021/07/15 Python
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA