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中set()函数简介及实例解析
Jan 09 Python
Python Xml文件添加字节属性的方法
Mar 31 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
python 匹配url中是否存在IP地址的方法
Jun 04 Python
Pycharm 实现下一个文件引用另外一个文件的方法
Jan 17 Python
解决Python中定时任务线程无法自动退出的问题
Feb 18 Python
Python爬虫之UserAgent的使用实例
Feb 21 Python
在Python中append以及extend返回None的例子
Jul 20 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
python等待10秒执行下一命令的方法
Jul 19 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 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中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
2009/05/25 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
jQuery中add()方法用法实例
2015/01/08 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
Bootstrap入门书籍之(三)栅格系统
2016/02/17 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
2016/05/09 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
js实现各浏览器全屏代码实例
2018/07/03 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
Three.JS实现三维场景
2018/12/30 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
2019/05/01 Javascript
提升Python程序运行效率的6个方法
2015/03/31 Python
Python实现注册登录系统
2017/08/08 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
python编写简单端口扫描器
2019/09/04 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
精彩自我鉴定
2014/01/16 职场文书
副总经理岗位职责
2015/02/02 职场文书
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers
js前端设计模式优化50%表单校验代码示例
2022/06/21 Javascript