django signals 的使用经历

项目应用:

django+python

 

最近有个需求是:

在管理页面变更数据后重新reload内存,将数据库数据load到内存中,保持内存数据时最新的。

 

最先遇到的问题是:由于admin的事务机制设置,在model部分执行完save、delete等操作后还在事务管理中没有没有进行commit操作,使得我在model中做的reload操作起不到效果,于是就想到在save之后reload之前commit,于是signals 应用的就被采用了。

之后就开始寻找signals的使用方法了,在网上查到下面的资料片段:

 

【signals 是 Django 中较少使用的功能,它可以提高代码的模块化程度。signals 定义保存模型或加载模板的事件,无论它在哪里运行,Django 项目都可以侦听到并对它做出反应。这意味着您可以轻松的提高应用程序的行为,而无需直接修改它们。

admin 提供了一个应用程序开发人员经常想修改的功能:通过 django.contrib.auth.models.User 类管理用户。Django 用户往往只能添加或修改 admin,这使得这个有用的类很难定制。

想象一下,您希望每次创建一个新的 User 对象时,站点管理员都能收到一封电子邮件。因为 User 模块无法直接在项目中使用,实现该目标的唯一方法似乎是子类化 User 或者使用间接方法,比如创建虚拟配置文件对象进行修改。 】

来自http://www.ibm.com/developerworks/cn/opensource/os-django-admin/

 

得此启发,为了搞得更明白些,我就从官网上找到Signals进行了详细了解:

路径如下

https://docs.djangoproject.com/en/dev/ref/signals/#

 

之后在models.py中添加下面代码:

def notify_admin_add(sender, instance, created , using , **kwargs):
    ''' 
    this function does commit operate when add instance successfully
    '''
    transaction.commit(using)

def notify_admin_delete(sender, instance, using, **kwargs):
    '''
    this function does commit operate and send a message to background server when delete instance
    '''
    transaction.commit(using)
    mtype = NotifyMsg.mtDel
    msg = NotifyMsg(NotifyMsg.tbSState, mtype)
    MsgQueue.notify(msg)


然后将监控信号“通知”具体Model,代码如下:

 

#notify admin page when add instance data 
signals.post_save.connect(notify_admin_add, sender=Isp, weak=False)
#notify admin page when delete instance data 
signals.post_delete.connect(notify_admin_delete, sender=Isp, weak=False)

  

此时基本上我的目的达到了,不过这样在事务之前commit操作会引起别的问题,会破坏admin设计的事务模式。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值