基于django中间件的思想,实现功能配置

前言

在学习django中间件期间,我们可以把不需要使用的中间件注释掉,就可以不使用这个中间件的功能,

  1. MIDDLEWARE = [
  2. 'django.middleware.security.SecurityMiddleware',
  3. 'django.contrib.sessions.middleware.SessionMiddleware',
  4. 'django.middleware.common.CommonMiddleware',
  5. # 'django.middleware.csrf.CsrfViewMiddleware',
  6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  7. 'django.contrib.messages.middleware.MessageMiddleware',
  8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  9. ]

那么我们可以尝试着使用django中间件的这种思想,来实现 这种功能.

前期准备

现在有个需求, 要实现一个群发信息的功能,通过邮件\短信\微信 通知信息.

实现:

先建两个文件:

  1. # notify.py
  2. def send_email(content):
  3. print(f'邮件通知:{content}')
  4. def send_msg(content):
  5. print(f'短信通知:{content}')
  6. def wechat(content):
  7. print(f'微信通知:{content}')
  8. from notify import *
  9. def send_all(content):
  10. send_email(content)
  11. send_msg(content)
  12. wechat(content)
  13. if __name__ == '__main__':
  14. send_all('版本更新')

这样就基本实现了初步的功能

importlib模块介绍

  1. # lib文件夹下a.py
  2. name = '你好啊'
  3. # b.py
  4. import importlib
  5. res = 'lib.aaa' # 通过字符串的形式导入模块
  6. md = importlib.import_module(res) # 相当于 from lib import aaa
  7. # 注意: 字符串的最小单位是文件,不能是文件里面的名字
  8. print(md.name)

基于django中间件的编程思想

  1. # notify文件夹下 __init__.py
  2. import settings
  3. import importlib
  4. def send_all(content):
  5. for path in settings.NOTIFY_LIST: # 'notify.email.Email'
  6. module_path, cls_name = path.rsplit('.', maxsplit=1)
  7. md = importlib.import_module(module_path) # from notify import Email
  8. cls = getattr(md, cls_name) # 获取到文件中类的名字
  9. obj = cls()
  10. obj.send(content)
  11. # email.py
  12. class Email(object):
  13. def __init__(self):
  14. pass # 这里写前期的准备
  15. def send(self, content):
  16. print(f'邮箱通知:{content}')
  17. # msg.py
  18. class Msg(object):
  19. def __init__(self):
  20. pass
  21. def send(self, content):
  22. print(f'短信通知:{content}')
  23. # wechat.py
  24. class Wechat(object):
  25. def __init__(self):
  26. pass
  27. def send(self, content):
  28. print(f'微信通知:{content}')
  29. # settings.py
  30. NOTIFY_LIST = [
  31. 'notify.email.Email',
  32. 'notify.msg.Msg',
  33. 'notify.wechat.Wechat'
  34. ]
  35. # start.py
  36. from notify import *
  37. send_all('我很不好')

django中settings源码

  1. Django中有两个配置文件,一个内部全局的,一个用户自定义
  2. 如果用户配置了,就使用该配置,否则使用内部全局设置

实现思路:先加载全局配置给对象设置,然后在加载局部配置 再给对象设置,一旦有重复的项 后者覆盖前者

配置文件的插拔式设计

基于django中配置文件的形式设计

目录设计

  1. # conf文件夹下 settings.py
  2. NAME = '我是暴露给用户的自定义配置'
  3. # global_settings.py
  4. NAME = '我是全局配置文件'
  5. # lib > conf下的__init__.py
  6. import os
  7. import importlib
  8. from lib.conf import global_settings
  9. class Settings(object):
  10. def __init__(self):
  11. for name in dir(global_settings):
  12. if name.isupper():
  13. setattr(self, name, getattr(global_settings, name))
  14. # 获取暴露给用户的配置文件的 字符串路径
  15. module_path = os.environ.get('xxx')
  16. md = importlib.import_module(module_path)
  17. for name in dir(md):
  18. if name.isupper():
  19. k = name
  20. v = getattr(md, name)
  21. setattr(self, k, v)
  22. settings = Settings()
  23. # start.py
  24. import os
  25. import sys
  26. sys.path.append(os.path.dirname(__file__))
  27. if __name__ == '__main__':
  28. os.environ['xxx'] = 'conf.settings'
  29. from lib.conf import settings
  30. print(settings.NAME)

基于django中间件的编程思想的更多相关文章

  1. Django中间件、csrf跨站请求、csrf装饰器、基于django中间件学习编程思想

    django中间件 中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出. ...

  2. csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能

    目录 csrf跨站请求网站 什么是csrf跨站请求网站 经典例子-钓鱼网站 模拟 如何避免这种现象(预防) 如何在django中解决这个问题 form表单 ajax csrf相关装饰器 FBV CBV ...

  3. Django中间件-跨站请求伪造-django请求生命周期-Auth模块-seettings实现可插拔配置(设计思想)

    Django中间件 一.什么是中间件 django中间件就是类似于django的保安;请求来的时候需要先经过中间件,才能到达django后端(url,views,models,templates), ...

  4. Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块

    目录 使用Django对中间件的调用思想完成自己的功能 功能要求 importlib模块介绍 功能的实现 csrf中间件详细介绍 跨站请求伪造 Django csrf中间件 form表单 ajax c ...

  5. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  6. Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09

    目录 昨日补充:将自己写的 login_auth 装饰装在 CBV 上 django 中间件 django 请求生命周期 ***** 默认中间件及其大概方法组成 中间件的执行顺序 自定义中间件探究不同 ...

  7. 16条Web2.0法则的编程思想

    1.在你开始之前,先定一个简单的目标.无论你是一个Web 2.0应用的创建者还是用户,请清晰的构思你的目标.就像“我需要保存一个书签”或者“我准 备帮助人们创建可编辑的.共享的页面”这样的目标,让你保 ...

  8. [Hadoop入门] - 1 Ubuntu系统 Hadoop介绍 MapReduce编程思想

    Ubuntu系统 (我用到版本号是140.4) ubuntu系统是一个以桌面应用为主的Linux操作系统,Ubuntu基于Debian发行版和GNOME桌面环境.Ubuntu的目标在于为一般用户提供一 ...

  9. Java编程思想(11~17)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第十一章 持有对象 11.1 泛型和类型安全的容器>eg: List<St ...

随机推荐

  1. CSS修饰文档

    定义字体类型 <html> <head> <meta http-equiv="Content-Type" content="text/htm ...

  2. Appium之UIAutomator API选择元素

    UI Automator测试框架提供了一组API来构建UI测试. 利用UI Automator API可以执行在测试设备中,打开‘设置’菜单或应用启动器等操作. UI Automator测试框架非常适 ...

  3. Kinect-v2 Examples with MS-SDK(译文二)

    K2-asset提供的脚本组件 K2-asset在KinectScripts文件夹中提供通用脚本组件,并在KinectDemos / 文件夹的相应脚本子文件夹中提供特定于演示的组件.可以在自己的Uni ...

  4. robot_framework常用关键字

    快捷键 F8 运行 ctrl+alt+空格 log 类似于print Set variable 定义变量 Catenate 连接对象 SEPARATOR 对多个连接信息进行分割 Create List ...

  5. Dubbo源码分析之SPI(三)

    一.概述 本篇介绍自适应扩展,方法getAdaptiveExtension()的实现.ExtensionLoader类本身很多功能也使用到了自适应扩展.包括ExtensionFactory扩展. 通俗 ...

  6. irules

    BIG-IP系统iRules基本概念_v11.6.1 2017年10月10日 00:35:16 ifelif 阅读数:1097   1 iRules介绍 什么是iRule iRule是BIG-IP本地 ...

  7. Nginx学习一路向西

    Nginx 学习一路向北 Java大猿帅成长手册,GitHub JavaEgg ,N线互联网开发必备技能兵器谱 1. Nginx简介 1.1 Nginx 概述 NGINX是一个免费.开源.高性能.轻量 ...

  8. 35个Java代码优化的细节,你知道几个?

    前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没 ...

  9. 《Java练习题》习题集三

    编程合集: https://www.cnblogs.com/jssj/p/12002760.html Java总结:https://www.cnblogs.com/jssj/p/11146205.ht ...

  10. C#访问SFTP:Renci.SshNet.Async

    SFTP是SSH File Transfer Protocol的缩写,安全文件传送协议.安全文件传送协议.可以为传输文件提供一种安全的网络的加密方法.sftp 与 ftp 有着几乎一样的语法和功能. ...