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之禅》中对于Python编程过程中的一些建议
Apr 03 Python
使用Python来开发Markdown脚本扩展的实例分享
Mar 04 Python
使用实现pandas读取csv文件指定的前几行
Apr 20 Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 Python
python实现二维插值的三维显示
Dec 17 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
Jul 01 Python
对django后台admin下拉框进行过滤的实例
Jul 26 Python
tensorflow 模型权重导出实例
Jan 24 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
Mar 05 Python
Python模拟登录requests.Session应用详解
Nov 17 Python
Python使用Pygame绘制时钟
Nov 29 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 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
通过html表格发电子邮件
2006/10/09 PHP
php验证session无效的解决方法
2014/11/04 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
别了 JavaScript中的isXX系列
2012/08/01 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
浅谈JavaScript异步编程
2017/01/20 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
python中requests模块的使用方法
2015/04/08 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
Python selenium文件上传方法汇总
2020/11/19 Python
python编程实现归并排序
2017/04/14 Python
Python表示矩阵的方法分析
2017/05/26 Python
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
int在python中的含义以及用法
2019/06/27 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
如何提高MySql的安全性
2014/06/19 面试题
英语专业毕业生求职简历的自我评价
2013/10/24 职场文书
创业计划书——互联网商机
2014/01/12 职场文书
一年级学生评语
2014/04/23 职场文书
文明班级建设方案
2014/05/15 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
企业总经理任命书
2014/06/05 职场文书
领导干部作风建设总结
2014/10/23 职场文书
2015年安全生产责任书
2015/01/30 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
护士2015年终工作总结
2015/04/29 职场文书