`
dongin
  • 浏览: 120314 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用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函数来处理缓存,将缓存中变动的部分从缓存中清除出去,从而达到数据的同步。这样只要有个好的清除算法,我们就不用来设置缓存的过期时间,因为缓存中的数据永远是最新的。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics