基于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 ...
随机推荐
- Ubuntu1604环境下编译安装mariadb10.2.26
环境准备:阿里云ecs Ubuntu1604下,编译安装mariadb10-2.26 1.先安装一些初试环境所需要的工具软件包 apt install -y iproute2 ntpdate tcpd ...
- E1.Send Boxes to Alice(Easy Version)//中位数
发送盒子给Alice(简单版本) 题意:准备n个盒子放巧克力,从1到n编号,初始的时候,第i个盒子有ai个巧克力. Bob是一个聪明的家伙,他不会送n个空盒子给Alice,换句话说,每个盒子里面都有巧 ...
- 【算法】342- JavaScript常用基础算法
一个算法只是一个把确定的数据结构的输入转化为一个确定的数据结构的输出的function.算法内在的逻辑决定了如何转换. 基础算法 一.排序 1.冒泡排序 //冒泡排序function bubbleSo ...
- Ansible-上部
Ansible概述 Ansible是一个配置管理系统configuration management systempython 语言是运维人员必须会的语言ansible 是一个基于python 开发的 ...
- Linux系统入门简介<1>
linux系统入门简介 我们为什么要学习Linux? 在介绍Linux的历史前,我想先针对大家如何对Linux的发音说一下.我发现我身边的朋友对Linux的发音大致有这么几种: "里那克斯& ...
- 解决visual studio换行(回车键)不能代码补全问题
打开工具--选项:将标红的位置改为true即可.
- 3种骚操作,教你查看 Java 字节码!
在我们工作.学习.以及研究 JVM 过程当中,不可避免的要查看 Java 字节码,通过查看字节码可以了解一个类的编译结果,也能通过编译器层面来分析一个类的性能. 字节码文件是不能直接打开的,下面栈长教 ...
- Docker图形化工具Portainer详解
一.介绍 说明: Portainer是易于使用的软件,可为软件开发人员和IT操作人员提供直观的界面. Portainer为你提供Docker环境的详细概述,并允许你管理容器,镜像,网络和数据卷 ...
- vue集成cesium,webgis平台第一步(附源码下载)
vue-cesium-platform Vue结合Cesium的web端gis平台 初步效果 笔记本性能限制,运行Cesium温度飙到70度以上.所以平时开发时先开发界面,之后加载Cesium地球 当 ...
- leetcode菜鸡斗智斗勇系列(4)--- 单一数字的乘积和总合的减法
1.原题: https://leetcode.com/problems/subtract-the-product-and-sum-of-digits-of-an-integer/ Given an i ...