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访问纯真IP数据库脚本分享
Jun 29 Python
Python+django实现文件下载
Jan 17 Python
DataFrame 将某列数据转为数组的方法
Apr 13 Python
对Python信号处理模块signal详解
Jan 09 Python
PyQt5 QListWidget选择多项并返回的实例
Jun 17 Python
用python做游戏的细节详解
Jun 25 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
django url到views参数传递的实例
Jul 19 Python
python数据库编程 ODBC方式实现通讯录
Mar 27 Python
Python CategoricalDtype自定义排序实现原理解析
Sep 11 Python
python help函数实例用法
Dec 06 Python
jupyter notebook更换皮肤主题的实现
Jan 07 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与MySQL交互使用详解
2006/10/09 PHP
PHP6 mysql连接方式说明
2009/02/09 PHP
PHP 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
又一个PHP实现的冒泡排序算法分享
2014/08/21 PHP
php实现中文转数字
2016/02/18 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
javascript:以前写的xmlhttp池,代码
2008/05/18 Javascript
SWFObject Flash js调用类
2008/07/08 Javascript
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
javascript禁制后退键(Backspace)实例代码
2013/11/15 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
如何防止INPUT按回车自动提交表单FORM
2016/12/06 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
jquery图片放大镜效果
2017/06/23 jQuery
React 源码中的依赖注入方法
2018/11/07 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
2018/02/13 Python
在pandas中一次性删除dataframe的多个列方法
2018/04/10 Python
解决在pycharm中显示额外的 figure 窗口问题
2019/01/15 Python
django中forms组件的使用与注意
2019/07/08 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
Python通过字典映射函数实现switch
2020/11/06 Python
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
给校长的建议书300字
2014/05/16 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS