基于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 ...
随机推荐
- CSS修饰文档
定义字体类型 <html> <head> <meta http-equiv="Content-Type" content="text/htm ...
- Appium之UIAutomator API选择元素
UI Automator测试框架提供了一组API来构建UI测试. 利用UI Automator API可以执行在测试设备中,打开‘设置’菜单或应用启动器等操作. UI Automator测试框架非常适 ...
- Kinect-v2 Examples with MS-SDK(译文二)
K2-asset提供的脚本组件 K2-asset在KinectScripts文件夹中提供通用脚本组件,并在KinectDemos / 文件夹的相应脚本子文件夹中提供特定于演示的组件.可以在自己的Uni ...
- robot_framework常用关键字
快捷键 F8 运行 ctrl+alt+空格 log 类似于print Set variable 定义变量 Catenate 连接对象 SEPARATOR 对多个连接信息进行分割 Create List ...
- Dubbo源码分析之SPI(三)
一.概述 本篇介绍自适应扩展,方法getAdaptiveExtension()的实现.ExtensionLoader类本身很多功能也使用到了自适应扩展.包括ExtensionFactory扩展. 通俗 ...
- irules
BIG-IP系统iRules基本概念_v11.6.1 2017年10月10日 00:35:16 ifelif 阅读数:1097 1 iRules介绍 什么是iRule iRule是BIG-IP本地 ...
- Nginx学习一路向西
Nginx 学习一路向北 Java大猿帅成长手册,GitHub JavaEgg ,N线互联网开发必备技能兵器谱 1. Nginx简介 1.1 Nginx 概述 NGINX是一个免费.开源.高性能.轻量 ...
- 35个Java代码优化的细节,你知道几个?
前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没 ...
- 《Java练习题》习题集三
编程合集: https://www.cnblogs.com/jssj/p/12002760.html Java总结:https://www.cnblogs.com/jssj/p/11146205.ht ...
- C#访问SFTP:Renci.SshNet.Async
SFTP是SSH File Transfer Protocol的缩写,安全文件传送协议.安全文件传送协议.可以为传输文件提供一种安全的网络的加密方法.sftp 与 ftp 有着几乎一样的语法和功能. ...