django signals 通过:
来定义你需要抛出的signals的地方和类型,django自己本身支持8个signals:
来捕获你想要的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可以通过:
来捕获数据库的变动,然后执行exe_signals函数来处理缓存,将缓存中变动的部分从缓存中清除出去,从而达到数据的同步。这样只要有个好的清除算法,我们就不用来设置缓存的过期时间,因为缓存中的数据永远是最新的。
python 代码
- from django.db.models import signals
- from django.dispatch import dispatcher
- dispatcher.send(signal=signals.post_save, sender=self.__class__, instance=self)
class_prepared,
pre_init,
post_init,
pre_save
,
post_save
,
pre_delete,
post_delete,
post_syncdb。然后通过:
python 代码
- from django.contrib.auth import models as auth_app
- dispatcher.connect(create_superuser, sender=auth_app, signal=signals.post_save)
曾经写过一个对网站的优化(django),在测试过程中发现数据库的连接数太大,有些是代码的原因,有些在代码级别不好改,所以就准备为这些连接写一个 缓存。基本思想是,从数据库取出来的queryset通过memcached缓存,以后的连接就直接到缓存去取,如果缓存中没有就到数据库中去取,然后缓 存起来。这过程中会涉及到一个问题,就是怎样保证数据库和缓存中数据的同步,在这里我用的是 django signals。
singals可以通过:
python 代码
- dispatcher.connect(exe_signals, signal=signals.post_save)
- dispatcher.connect(exe_signals, signal=signals.post_delete)