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 ...
随机推荐
- SQL Server的聚集索引和非聚集索引
微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引)…… (一) ...
- zabbix结合grafana
一.下载grafana 下载地址: http://docs.grafana.org/installation/rpm/ https://s3-us-west-2.amazonaws.com/grafa ...
- linux zip解压缩中文乱码
这里提供两个解决方案: 1.python处理下:https://gist.github.com/wangjiezhe/7841a350983a147b6d7e 2.java的zip4j:http:// ...
- c语言和设计模式
在网上看到一个博客专门写了关于设计模式的文章,感觉很有用.其实,我感觉数据结构 算法 设计模式 这三样同等重要啊. 数据结构 算法相对而言接触的比较多,但设计模式这个东西真的一头雾水,有时候觉得别人写 ...
- 商业级别Fortify白盒神器介绍与使用分析
转自:http://www.freebuf.com/sectool/95683.html 什么是fortify它又能干些什么? 答:fottify全名叫:Fortify SCA ,是HP的产品 ,是一 ...
- Excel中使用VBA访问Access数据库
VBA访问Access数据库 1. 通用自动化语言VBA VBA(Visual Basic For Application)是一种通用自动化语言,它可以使Excel中的常用操作自动化,还可以创建自定义 ...
- UVa 10766 Organising the Organisation (生成树计数)
题意:给定一个公司的人数,然后还有一个boss,然后再给定一些人,他们不能成为直属上下级关系,问你有多少种安排方式(树). 析:就是一个生成树计数,由于有些人不能成为上下级关系,也就是说他们之间没有边 ...
- 20160214 2016-2017-2 实验二《Java面向对象》实验报告
实验二 面向对象程序设计 (一)单元测试 写一段关于分数标准的代码,如下: public class MyUtil{ public static String percentage2fivegrade ...
- C#中遇到的方法总结
1.Select(string filterExpression, string sort) // 获取按照指定的排序顺序且与筛选条件相匹配的所有 System.Data.DataRow 对象的数组 ...
- 前端jq设置下拉框的,单选框,复选框的帖子
$(function(){ var sex=$("#sex").val(); var marriageStatus=$("#marriageStatus").v ...