用django signals来同步数据

       django signals 通过:
python 代码
  1. from django.db.models import signals  
  2. from django.dispatch import dispatcher  
  3. dispatcher.send(signal=signals.post_save, sender=self.__class__, instance=self)  
来定义你需要抛出的signals的地方和类型,django自己本身支持8个signals: class_prepared, pre_init, post_init, pre_savepost_savepre_delete, post_delete, post_syncdb。然后通过:
python 代码
  1. from django.contrib.auth import models as auth_app  
  2. dispatcher.connect(create_superuser, sender=auth_app, signal=signals.post_save)  
来捕获你想要的signals,这里是auth_app 的signals.post_save,当捕获到这个signals时调用create_superuser函数,这个函数可以获得抛出signals的对象实例(instance),但是我发现,这个实例的属性是可以得到的,但是却不具备数据库关系。就是通过这个实例并不能得到外键对象的属性。例如: 我们有对象A和B, B是A的外键,利用signals我们获得了A的实例a,但是通过a我们并不能获得B的的属性。下面讲一个我在项目中的应用:

        曾经写过一个对网站的优化(django),在测试过程中发现数据库的连接数太大,有些是代码的原因,有些在代码级别不好改,所以就准备为这些连接写一个 缓存。基本思想是,从数据库取出来的queryset通过memcached缓存,以后的连接就直接到缓存去取,如果缓存中没有就到数据库中去取,然后缓 存起来。这过程中会涉及到一个问题,就是怎样保证数据库和缓存中数据的同步,在这里我用的是 django signals
      singals可以通过:
python 代码
  1. dispatcher.connect(exe_signals, signal=signals.post_save)  
  2. dispatcher.connect(exe_signals, signal=signals.post_delete)  
来捕获数据库的变动,然后执行exe_signals函数来处理缓存,将缓存中变动的部分从缓存中清除出去,从而达到数据的同步。这样只要有个好的清除算法,我们就不用来设置缓存的过期时间,因为缓存中的数据永远是最新的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值