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 ...
随机推荐
- 为什么要使用href=”javascript:void(0);”
为什么要使用href=”javascript:void(0);” href=”javascript:void(0);”这个的含义是,让超链接去执行一个js函数,而不是去跳转到一个地址,而void( ...
- p2319 [HNOI2006]超级英雄
传送门 分析 从1道m进行匹配,找到第一个不能继续匹配的点即可 代码 #include<iostream> #include<cstdio> #include<cstri ...
- CF 1097D Makoto and a Blackboard
算是记一下昨天晚上都想了些什么 官方题解 点我 简单题意 给定两个正整数$n$和$k$,定义一步操作为把当前的数字$n$等概率地变成$n$的任何一个约数,求$k$步操作后的期望数字,模$1e9 + ...
- js改变触发
onchange="doEmpty($(this))"
- JSON Web Token(JWT)学习笔记
1.JWT 的Token 标准的Token由三个部分并以.(点号)连接方式组成,即 header.payload.signature,如下 eyJhbGciOiJIUzI1NiIsInR5cCI6Ik ...
- 使用VM克隆CentOS后,更改网络配置
在使用VM克隆之后,遇到一件非常郁闷的事,就算我使用‘setup’命令,修改了我的网络配置,依然无法查询到我配置的网卡,也无法开启网卡. 经过百度等一系列手段,总结如下套路--PS:朋友称之为“破釜沉 ...
- spring Aop概念
面向切面编程(AOP)通过提供另外一种思考程序结构的途经来弥补面向对象编程(OOP)的不足.在OOP中模块化的关键单元是类(classes),而在AOP中模块化的单元则是切面.切面能对关注点进行模块化 ...
- JavaScript的词法作用域问题
多年以前,当我怀揣着前端工程师的梦想时,曾经认真阅读过<JavaScript高级程序设计(第2版)>.里面有一个问题(P147),让我一直百思不得其解. function createFu ...
- Shapefile点图层转换为Shapefile线图层
在Oracle数据表转换为Shapefile(一)和Oracle数据表转换为Shapefile(二)两篇文章中,分别介绍了两种不同的根据Oracle数据表生成Shapefile点图层的方法.本文在此基 ...
- Spring学习(一)——环境准备
以前做的项目都是用.net开发的,以后准备迁移到java平台上,近期正好有个新项目要上马,所以调研下java相关技术.Spring作为java平台下的一个全栈框架, 其简洁优雅的设计和 ...