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实现的一个火车票转让信息采集器
Jul 09 Python
用Python编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
python字符串常用方法
Jun 14 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
Jul 06 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
python 求1-100之间的奇数或者偶数之和的实例
Jun 11 Python
python pygame实现球球大作战
Nov 25 Python
使用python切片实现二维数组复制示例
Nov 26 Python
python中文分词库jieba使用方法详解
Feb 11 Python
sklearn+python:线性回归案例
Feb 24 Python
pandas数据处理之绘图的实现
Jun 15 Python
如何Tkinter模块编写Python图形界面
Oct 14 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
谈一谈收音机的高放电路
2021/03/02 无线电
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
tp5框架使用cookie加密算法实现登录功能示例
2020/02/10 PHP
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
js+html制作简单验证码
2017/02/16 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
Python下载懒人图库JavaScript特效
2015/05/28 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
python最长回文串算法
2018/06/04 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
python pytest进阶之fixture详解
2019/06/27 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
Python3实现mysql连接和数据框的形成(实例代码)
2020/01/17 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
法国和欧洲海边和滑雪度假:Pierre & Vacances
2017/01/04 全球购物
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
中国跨境电子商务网站:NewFrog
2018/03/10 全球购物
法务专员岗位职责
2014/01/02 职场文书
优秀党员主要事迹
2014/01/19 职场文书
保险公司晨会主持词
2014/03/22 职场文书
分居协议书范本
2014/11/03 职场文书
慰问信格式规范
2015/03/23 职场文书
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android