sqlalchemy中使用event设置条件触发短信与邮件通知
一.原因
近期在做短信与邮件通知系统。使用到了这一块。例如,当订单完成以后进行邮件短信的通知。虽然可以采用直接调用接口的方式实现,但有几个原因让我希望使用条件触发的方式
1.由于系统中支持线上线下以及代充值等多种方式,所以在多个地方订单改变状态。这样就让触发通知的代码凌乱分布。
2.系统将来扩建,需要新增加接口。则需要新增加调用的代码。
总而言之,直接调用将会增加维护难度。因此准备在订单的状态首次被置为支付成功时候进行短信与邮件的通知。
二.模块需求
短信与邮件的通知不能影响内部系统的运行,但由于是远程调用,时间是未知的。为了满足需求,模块必须满足以下条件
1.短信,邮件的发送使用线程
2.触发必须在数据库事务完成的状态下进行。
三.sqlalchemy的监听类型
sqlalchemy是我们采取的数据库后台python接口。它的事务触发机制包括
1.orm中的字段改变触发
2.orm对象状态改变触发
3.session改变触发
4.连接池事件,连接事件
四.具体实现
1.方式一
一开始我采用了倾听字段改变的事件
@event.listens_for(Order.status,"set",retval=True)
def pay_success_reminder(target, value, oldvalue, initiator):
'''
已经充值成功,给用户发送提醒
:return:
'''
if value==oldvalue:return value
if value=="pay_success":#支付成功
try:
......
pass
except Exception as e:
pass
return value
这个事件在订单状态改变的时候就会触发,不幸的事,他触发在事务当中,当然,如果在其中另外线程去执行发送短信与邮件应该也无妨。但处于某些原因我希望在事务处理完成之后调用。
2.方式二
另外一种方式,监听对象的更新事件,并在更新事件处理中监听这个session commit事件。这样就能够完成commit之后对该对象的处理。
def pay_success_reminder2(order_no):
def func(session):
try:
......
pass
except Exception as e:
pass
return True
return func @event.listens_for(Order, 'after_insert',raw=True)
@event.listens_for(Order, 'after_update',raw=True)
def pay_success_reminder1(mapper, connection, target):#
'''
已经充值成功,给用户发送提醒
:return:
'''
if target.dict["status"]!=target.committed_state["status"] and target.dict["status"]=="pay_success":
event.listen(target.session,"after_commit",pay_success_reminder2(target.dict["order_no"]) )
如果需要将某些信息传递给session状态监听处理函数,则在需要使用函数包装的方式传递变量。
sqlalchemy中使用event设置条件触发短信与邮件通知的更多相关文章
- IOS中调用系统的电话、短信、邮件、浏览功能
iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评 ...
- iOS程序中调用系统自带应用(短信,邮件,浏览器,地图,appstore,拨打电话,iTunes,iBooks )
在网上找到了下在记录下来以后方便用 在程序中调用系统自带的应用,比如我进入程序的时候,希望直接调用safar来打开一个网页,下面是一个简单的使用:
- ios 设置亮度、声音;调用发短信、邮件、打电话
一,设置亮度 [[UIScreen mainScreen] setBrightness:0.5];//0.0~1.0 二,设置声音 1,添加 MediaPlayer.framework 框架 2,在需 ...
- zabbix实现电话、短信、邮件报警
该报警方式提前说明:(1)该方式可以实现zabbix免费电话报警以及微信.短信.邮件报警,但有数量限制.详见如下:如数量不能满足需要以及人员需要,可以考虑购买收费版.(2)毕竟是免费版,电话通知要省着 ...
- MVC使用ASP.NET Identity 2.0实现用户身份安全相关功能,比如通过短信或邮件发送安全码,账户锁定等
本文体验在MVC中使用ASP.NET Identity 2.0,体验与用户身份安全有关的功能: →install-package Microsoft.AspNet.Identity.Samples - ...
- HTML5的头部、拨号、短信、邮件(转)
HTML5[语法要点] 一.头部设置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <!--页面窗口自动调整到设备 ...
- iOS学习笔记28-系统服务(一)短信和邮件
一.系统应用 在开发某些应用时,我们可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,或者直接调用安装的第三方应用,这个要怎么实现呢? 这里统一使用UIApplication的一个对象方法 ...
- ios开发——实用技术篇Swift篇&地址薄、短信、邮件
//返回按钮事件 @IBAction func backButtonClick() { self.navigationController?.popViewControllerAnimated(tru ...
- Android实例-打电话、发短信和邮件,取得手机IMEI号(XE8+小米2)
结果: 1.不提示发短信卡住,点击没有反映,我猜想,可能是因为我用的是小米手机吧. 2.接收短信报错,我猜想可能是我改了里面的方法吧(哪位大神了解,求指教). 3.project -->opti ...
随机推荐
- Opencv 直方图比较
#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...
- android开发环境完整搭建
1.首先,要先下载安装包,共享一个网址,里面有非常全面的安装文件,不管是windows还是linux的,都有,网址如下:http://www.cnblogs.com/tc310/p/3938353.h ...
- Python 中的 is 和 id-乾颐堂
(ob1 is ob2) 等价于 (id(ob1) == id(ob2)) 首先id函数可以获得对象的内存地址,如果两个对象的内存地址是一样的,那么这两个对象肯定是一个对象.和is是等价的.Pytho ...
- Part2_lesson1---arm家族大检阅
芯片(比如2440.6410.210等等)包含ARM核. 指令结构和ARM核有关系: ARM9对应指令架构版本ARMV4 ARM11对应指令架构版本ARMV6 cortex A8对应指令架构版本ARM ...
- wins 软件安装
1.x86 x64区别86就是原来的32位操作系统64就是现在比较新的64位操作系统
- input框添加阴影效果
.input:hover,.input:focus{ border:1px solid #85afe1; -webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0 ...
- CBV加装饰器解决登录注册问题和 <<中间件>>
文本目录 CBV加装饰器解决登录注册问题 一:什么是中间件 二:中间件有什么用 三:自定义中间件 四:中间件应用场景 五:SCRF TOKEN跨站请求伪造 六: 其他操作 CBV加装饰器解决登录注册问 ...
- oracle11g客户端配置及使用(Instant Client)
http://www.oracle.com/technetwork/topics/winx64soft-089540.html http://www.cnblogs.com/ychellboy/a ...
- 高并发Redis(Mac)环境配置(一)
一.产生原因: SNS交互型网站的兴起,对于高并发,大负载数据的操作,海量数据的存储和访问 NoSql四种类型: 键值存储(Redis优点可以快速查询,缺点缺少存储的结构化) ...
- 新浪微博Android开发获取Access_token的步骤
最近学习Android的开发,学完书本之后,决定研究如何开发一个微博客户端来实践.第一步当然是用户授权.但是新浪开放平台的说明实在写得不太清楚,用GOOGLE+研读的方法,总算是实验成功了. 这里有别 ...