项目应用:
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设计的事务模式。