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

相关推荐

    Django-1.4官方文档(pdf)

    - 信号机制(Signals):Django事件系统,允许开发者在模型层、视图层的某些事件发生时执行代码。 - 部署指南(Deploying Django):提供了将Django项目部署到生产环境的指导,包括使用Wsgi服务器等。 - 错误报告...

    python的Django框架模型

    Python的Django框架模型是Django的核心组成部分之一,它提供了数据模型的设计和数据库交互的能力。在Django中,模型(Model)是用来描述数据库结构的Python类,它定义了数据库表的字段、类型以及各种关系。下面我们...

    将Django使用的数据库从MySQL迁移到PostgreSQL的教程

    1. **Django 信号(Signals)**:在迁移过程中,你可能需要临时禁用Django的信号处理程序,以防止在数据迁移期间触发不必要的模型操作。 2. **自定义序列化**:如果你的模型包含复杂的数据类型或自定义序列化逻辑,...

    更改字段的Django信号_Python_下载.zip

    本资料“更改字段的Django信号_Python_下载.zip”可能包含了如何在Django中使用信号处理程序来监听并响应模型字段更改的教程。以下是对这一主题的详细讲解: 1. Django信号基础: - Django信号是Python的装饰器和...

    使用Celery的Django异步信号处理。_Python_下载.zip

    在Python的Web开发框架Django中,为了...在实际项目中,你可以根据需求扩展这种模式,处理更多的异步任务,如数据同步、定时任务、复杂计算等。记住,合理利用Celery和Django信号可以显著提升Web应用的效率和用户体验。

    基于GrégoireCachet的优秀要点的Django事务的提交和回滚信号。_Python_下载.zip

    在Python的Web开发框架Django中,事务管理是确保数据一致性、可靠性和持久性的重要机制。Grégoire Cachet的优秀要点深入探讨了Django中的事务处理,特别是关于事务的提交和回滚信号。这些信号使得开发者能够更精细...

    利用django model save方法对未更改的字段依然进行了保存

    当我们调用`save()`方法时,即使没有对某些字段进行修改,Django也会默认将当前对象的所有字段值同步到数据库,这可能导致意外的数据覆盖。标题和描述中提到的问题,即在更新特定字段后,其他未更改的字段值在`save...

Global site tag (gtag.js) - Google Analytics