基于django中间件的编程思想
基于django中间件的思想,实现功能配置
前言
在学习django中间件期间,我们可以把不需要使用的中间件注释掉,就可以不使用这个中间件的功能,
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
那么我们可以尝试着使用django中间件的这种思想,来实现 这种功能.
前期准备
现在有个需求, 要实现一个群发信息的功能,通过邮件\短信\微信 通知信息.
实现:
先建两个文件:
# notify.py
def send_email(content):
print(f'邮件通知:{content}')
def send_msg(content):
print(f'短信通知:{content}')
def wechat(content):
print(f'微信通知:{content}')
from notify import *
def send_all(content):
send_email(content)
send_msg(content)
wechat(content)
if __name__ == '__main__':
send_all('版本更新')
这样就基本实现了初步的功能
importlib模块介绍

# lib文件夹下a.py
name = '你好啊'
# b.py
import importlib
res = 'lib.aaa' # 通过字符串的形式导入模块
md = importlib.import_module(res) # 相当于 from lib import aaa
# 注意: 字符串的最小单位是文件,不能是文件里面的名字
print(md.name)
基于django中间件的编程思想

# notify文件夹下 __init__.py
import settings
import importlib
def send_all(content):
for path in settings.NOTIFY_LIST: # 'notify.email.Email'
module_path, cls_name = path.rsplit('.', maxsplit=1)
md = importlib.import_module(module_path) # from notify import Email
cls = getattr(md, cls_name) # 获取到文件中类的名字
obj = cls()
obj.send(content)
# email.py
class Email(object):
def __init__(self):
pass # 这里写前期的准备
def send(self, content):
print(f'邮箱通知:{content}')
# msg.py
class Msg(object):
def __init__(self):
pass
def send(self, content):
print(f'短信通知:{content}')
# wechat.py
class Wechat(object):
def __init__(self):
pass
def send(self, content):
print(f'微信通知:{content}')
# settings.py
NOTIFY_LIST = [
'notify.email.Email',
'notify.msg.Msg',
'notify.wechat.Wechat'
]
# start.py
from notify import *
send_all('我很不好')
django中settings源码
- Django中有两个配置文件,一个内部全局的,一个用户自定义
- 如果用户配置了,就使用该配置,否则使用内部全局设置
实现思路:先加载全局配置给对象设置,然后在加载局部配置 再给对象设置,一旦有重复的项 后者覆盖前者
配置文件的插拔式设计
基于django中配置文件的形式设计
目录设计

# conf文件夹下 settings.py
NAME = '我是暴露给用户的自定义配置'
# global_settings.py
NAME = '我是全局配置文件'
# lib > conf下的__init__.py
import os
import importlib
from lib.conf import global_settings
class Settings(object):
def __init__(self):
for name in dir(global_settings):
if name.isupper():
setattr(self, name, getattr(global_settings, name))
# 获取暴露给用户的配置文件的 字符串路径
module_path = os.environ.get('xxx')
md = importlib.import_module(module_path)
for name in dir(md):
if name.isupper():
k = name
v = getattr(md, name)
setattr(self, k, v)
settings = Settings()
# start.py
import os
import sys
sys.path.append(os.path.dirname(__file__))
if __name__ == '__main__':
os.environ['xxx'] = 'conf.settings'
from lib.conf import settings
print(settings.NAME)
基于django中间件的编程思想的更多相关文章
- Django中间件、csrf跨站请求、csrf装饰器、基于django中间件学习编程思想
django中间件 中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出. ...
- csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能
目录 csrf跨站请求网站 什么是csrf跨站请求网站 经典例子-钓鱼网站 模拟 如何避免这种现象(预防) 如何在django中解决这个问题 form表单 ajax csrf相关装饰器 FBV CBV ...
- Django中间件-跨站请求伪造-django请求生命周期-Auth模块-seettings实现可插拔配置(设计思想)
Django中间件 一.什么是中间件 django中间件就是类似于django的保安;请求来的时候需要先经过中间件,才能到达django后端(url,views,models,templates), ...
- Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块
目录 使用Django对中间件的调用思想完成自己的功能 功能要求 importlib模块介绍 功能的实现 csrf中间件详细介绍 跨站请求伪造 Django csrf中间件 form表单 ajax c ...
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- Django-中间件-csrf扩展请求伪造拦截中间件-Django Auth模块使用-效仿 django 中间件配置实现功能插拔式效果-09
目录 昨日补充:将自己写的 login_auth 装饰装在 CBV 上 django 中间件 django 请求生命周期 ***** 默认中间件及其大概方法组成 中间件的执行顺序 自定义中间件探究不同 ...
- 16条Web2.0法则的编程思想
1.在你开始之前,先定一个简单的目标.无论你是一个Web 2.0应用的创建者还是用户,请清晰的构思你的目标.就像“我需要保存一个书签”或者“我准 备帮助人们创建可编辑的.共享的页面”这样的目标,让你保 ...
- [Hadoop入门] - 1 Ubuntu系统 Hadoop介绍 MapReduce编程思想
Ubuntu系统 (我用到版本号是140.4) ubuntu系统是一个以桌面应用为主的Linux操作系统,Ubuntu基于Debian发行版和GNOME桌面环境.Ubuntu的目标在于为一般用户提供一 ...
- Java编程思想(11~17)
[注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第十一章 持有对象 11.1 泛型和类型安全的容器>eg: List<St ...
随机推荐
- Zookeeper选取机制
1)半数机制:集群中半数以上机器存活,集群可用.所以Zookeeper适合安装奇数台服务器. 2)Zookeeper虽然在配置文件中并没有指定Master和Slave.但是,Zookeeper工作时, ...
- 【解决】http: server gave HTTP response to HTTPS client
[问题]上传镜像到私有仓库时报错 $ docker push xxx.xxx.xxx.xxx:5000/java-8 The push refers to repository [xxx.xxx.xx ...
- Pyhton表白代码——浪漫圣诞节
圣诞节即将到了,所以这回通过turtle模块来编写一个表白的小程序 开发时间:2019-12-15 开发工具:Sublime 开发模块:turtle 这里用到了turtle库的相关知识,如果不熟悉可以 ...
- Java 将Excel转为图片、html、XPS、XML、CSV
通过文档格式转换,可满足不同办公场合对文档操作的需求.本文将介绍转换Excel文档为其他常见文档格式的方法.通过文中的方法,可支持将Excel转换为包括PDF.图片.html.XPS.XML.CSV. ...
- Django 06
目录 注意 聚合查询 分组查询 F与Q查询 orm字段和参数 自定义字段类型 事务 ACID 三大范式 开启事务 注意 只要和数据库相关的功能, 基本在 django.db.models 里面 聚合查 ...
- Django 05
目录 配置测试脚本文件 单表操作 增加数据 查询数据 修改数据 删除数据 查询十三太保 双下划线查询 连表下的数据增删改 一对多/一对一 多对多 跨表查询 基本对象的跨表查询 (子查询) 基于双下划线 ...
- ES7中的async 和 await
async 和 await 一个函数如果加上 async ,那么该函数就会返回一个 Promise async function test() { return "1" } con ...
- CentOS7安装部署squid服务(透明代理+反向代理)
一.squid服务介绍 Squid是一个高性能的代理缓存服务器,Squid支持FTP.gopher.HTTPS和HTTP协议.和一般的代理缓存软件不同,Squid用一个单独的.非模块化的.I/O驱动的 ...
- 曹工说Spring Boot源码(3)-- 手动注册Bean Definition不比游戏好玩吗,我们来试一下
写在前面的话 相关背景及资源: 曹工说Spring Boot源码系列开讲了(1)-- Bean Definition到底是什么,附spring思维导图分享 工程代码地址 思维导图地址 工程结构图: 大 ...
- Spring Cloud第十篇 | 分布式配置中心Config
本文是Spring Cloud专栏的第十篇文章,了解前九篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Clo ...