Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
实现抽象类的两种方式
方式一
from abc import ABCMeta
from abc import abstractmethod class BaseMessage(metaclass=ABCMeta): @abstractmethod
def send(self,subject,body,to,name):
pass
方式二
class BaseMessage(object):
def send(self, subject, body, to, name):
raise NotImplementedError('未实现send方法')
邮件提醒
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from .base import BaseMessage class Email(BaseMessage):
def __init__(self):
self.email = "寄件人的邮箱地址"
self.user = "寄件人姓名"
self.pwd = '邮箱密码或SMTP授权码' def send(self,subject,body,to,name):
'''
:param subject: 主题
:param body: 内容
:param to:接受者
:param name:接受者姓名
:return:
''' msg = MIMEText(body, 'plain', 'utf-8') # 发送内容
msg['From'] = formataddr([self.user,self.email]) # 发件人
msg['To'] = formataddr([name, to]) # 收件人
msg['Subject'] = subject # 主题 server = smtplib.SMTP("smtp.126.com", 25) # SMTP服务
server.login(self.email, self.pwd) # 邮箱用户名和密码
server.sendmail(self.email, [to, ], msg.as_string()) # 发送者和接收者
server.quit()
动态导入模块+反射
settings
# ################## 自定义消息提醒的配置 ###################
MESSAGE_CLASSES = [
'utils.message.email.Email',
'utils.message.msg.Msg',
'utils.message.wx.WeChat',
'utils.message.dingding.DingDing',
]
import importlib
from django.conf import settings
def send_message(to,name,subject,body):
"""
短信、邮件、微信
:param to: 接受者
:param name: 接受者姓名
:param subject: 主题
:param body: 内容
:return:
"""
for cls_path in settings.MESSAGE_CLASSES:
# cls_path是字符串
module_path,class_name = cls_path.rsplit('.',maxsplit=1) # 得到模块名的地址和模块里的一个类名(都是字符串)
m = importlib.import_module(module_path) # 导入模块
obj = getattr(m,class_name)()·# 通过反射,得到字符串class_name对应的类,并实例化
obj.send(subject,body,to,name,) # 执行对应的send方法
Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)的更多相关文章
- Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
		
实现抽象类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...
 - python_106_创建类的两种方式
		
class Foo(object): def __init__(self, name): self.name = name f = Foo("alex") print(type(f ...
 - Python 自定义元类的两种写法
		
有关元类是什么大家自己搜索了解,我这里写一下实现元类的两种写法 # 自定义元类 #继承type class LowercaseMeta(type): ''' 修改类的属性名称为小写的元类 ''' # ...
 - MyBatis开发Dao层的两种方式(Mapper动态代理方式)
		
MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...
 - Python 防止mysql 注入的两种方式
		
Python防止sql注入一般有两种方法 1.escape_string MySQLdb.escape_string(param) 注意:如果报错出现 'ascii' codec can't en ...
 - python安装第三方包的两种方式
		
最近研究QQ空间.微博的(爬虫)模拟登录,发现都涉及RSA算法.于是需要下一个RSA包(第三方包).折腾了很久,主要是感觉网上很多文章对具体要在哪里操作写得不清楚.这里做个总结,以免自己哪天又忘了. ...
 - xml转json和实体类的两种方式
		
本文为博主原创,未经允许不得转载: xml在http通信中具有较高的安全性和传输速度,所以应用比较广泛, 在项目中往往需要对xml,json和实体类进行相互转换,在这里总结一下自己所用到的一些方法: ...
 - python数字转换为字符串的两种方式
		
主要包括两种形式进行转换: 第一种是str(),将值转换为用户便于阅读的形式: 另一种是repr(),将值转换为合法的python表达式. >>> print repr(" ...
 - 实现mapper接口注入的两种方式,以及后台的使用区别
		
1.使用模板方式: <!--使用模板类实现mybatis --> <bean id="sqlSession" class="org.mybatis.sp ...
 
随机推荐
- MERGE语法详解
			
merge语法是根据源表对目标表进行匹配查询,匹配成功时更新,不成功时插入. 其基本语法规则是 merge into 目标表 a using 源表 b on(a.条件字段1=b.条件字段1 and a ...
 - SFTP工具类 操作服务器
			
package com.leadbank.oprPlatform.util;import com.jcraft.jsch.*;import com.jcraft.jsch.ChannelSftp.Ls ...
 - macox下编译snappy静态库
			
源代码地址:https://github.com/google/snappy 下载 git clone https://github.com/google/snappy 编译 进入snappy源代码文 ...
 - freemarker四种变量
			
freemarker四种变量 1.简单介绍说明 (1)数据模型中的变量:root中的变量 (2)模板中的变量:使用<#assign>定义的变量 (3)局部变量:在指令中的变量 (4)循环变 ...
 - openstack初始化Glance数据库时报错解决方式
			
环境为win7+virtualbox 中的centos6.5 安装Glance 的包 yum install openstack-glance python-glanceclient -y 配置Gla ...
 - IIS中遇到无法预览的问题(HTTP 错误 401.3 - Unauthorized 因为 Web server上此资源的訪问控制列表(ACL)配置或加密设置,您无权查看此文件夹或页面。)
			
在IIS中 依次运行例如以下操作: 站点--编辑权限--共享(为了方便能够直接将分享对象设置为everyone)--安全(直接勾选 everyone )--应用--确定.
 - effective java笔记之单例模式与序列化
			
单例模式:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." 单例模式实现方式有多种,例如懒汉模式(等用到时候再实例化),饿汉模式(类加载时就实例化)等,这里用饿汉模式方法 ...
 - 用IFeatureWorkspaceAnno.CreateAnnotationClass 创建注记图层时报“The application is not licensed to modify or create schema”的错误的解决方案。
			
用IFeatureWorkspaceAnno.CreateAnnotationClass 的方法创建注记图层的时候报"The application is not licensed to m ...
 - bootstrap表格固定表头,表格内容滚动条滚动显示
			
直接贴代码--- <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
 - python数字转字符串
			
参考文献: tt=322 tem='%d' %tt 可用,已经试用