use django signal in better way - WBowam/wbowam.github.com GitHub Wiki

Date: 2015-04-26
Title: 正确使用django signal
Tags: Django, Signal
Category: IT

当我学会使用Django signal时无比兴奋,正如大多数django开发者

新的开发人员得知django signal后会无比兴奋,很喜欢使用它.只要是能用它的地方就会用它,无意中身处坑底.为什么说是个坑呢?

问题

错误的用法:

  • 大量使用django signal;
  • 用signal处理大的进程;

导致:

  • django项目越来越复杂;
  • 项目效率越来越低;

原因

新鸟很容易认为signal是异步的.   其实django signal是同步的.

django signal的正确用法

  1. 尽量避免使用django signal(能用其他方法处理就用其他方法处理,如下)
    1. post_save和pre_save的逻辑可以考虑放在Model的save里
    2. 不要在pre_save里做数据验证.可以去自定义ModelForm的clean();也可以自己写一个validator
    3. 有些复杂的操作你可以用ModelManager来处理
  2. 给它异步的功能(如,与celery一起使用) 有些情况下不得不使用signal,如下:
    1. signal的receiver需要同事操作多个Model
    2. 清除cache时
    3. 无法使用其他方法替代signal时