教你如何在Django 1.6中正确使用 Signal

 更新时间:2014年06月22日 11:50:35   投稿:hebedich  
因为新的django开发人员得知signal之后, 往往会很高兴去使用它. 他们在能使用signal的地方就使用signal, 并且这是他们觉得自己是django专家一样. 然而, 像这样编码一段时间后, django项目就会变得异常复杂, 许多内容都纠结在一起无法解开.

简单回答是: 在其他方法无法使用的情况下, 才最后考虑使用signal.

因为新的django开发人员得知signal之后, 往往会很高兴去使用它. 他们在能使用signal的地方就使用signal, 并且这是他们觉得自己是django专家一样. 然而, 像这样编码一段时间后, django项目就会变得异常复杂, 许多内容都纠结在一起无法解开.

许多开发者也会将django signal和异步消息列队(例如celery)搞混. signal是同步处理, 因此通过signal调用大处理量的进程时并无法提高性能. 事实上, 将这些需要大处理量的进程移到signal中被视作是一种不好的习惯.

1. 何时使用signal

以下情况不要使用signal:

signal与一个model紧密相关, 并能移到该model的save()时
signal能使用model manager代替时
signal与一个view紧密相关, 并能移到该view中时
以下情况可以使用signal:

signal的receiver需要同时修改对多个model时
将多个app的相同signal引到同一receiver中处理时
在某一model保存之后将cache清除时
无法使用其他方法, 但需要一个被调函数来处理某些问题时
2. Signal的代替方法

使用mod而来manager

以下代码演示了当用户创建Event model时, 需要通知管理员, 如果改写model中的post_save(), 则需要添加额外的逻辑来区分用户还是管理员:

# myapp/managers.py
 from django.db import models

 class EventManager(models.Manager):

 def create_event(self, title, start, end, creator):
 event = self.model(title=title, start=start, end=end, creator=creator)
 event.save()
 event.notify_admins()
 return event

在model中设置model manager:

# myapp/models.py
 from django.conf import settings
 from django.core.mail import mail_admins
 from django.db import models

 from model_utils.models import TimeStampedModel
 from .managers import EventManager

 class Event(TimeStampedModel):

 STATUS_UNREVIEWED, STATUS_REVIEWED = (0, 1)
 STATUS_CHOICES = (
 (STATUS_UNREVIEWED, "Unreviewed"),
 (STATUS_REVIEWED, "Reviewed")
 )

 title = models.CharField(max_length=100)
 start = models.DateTimeField()
 end = model.dateTimeField()
 status = models.IntegerField(choices=STATUS_CHOICES, default=STATUS_UNREVIEWED)
 creator = models.ForeignField(settings.AUTH_USER_MODEL)
 objects = EventManager()

 def notify_admins(self):
 subject = "{user} submitted a new event!".format(user=self.creator.get_full_name())
 message = """TITLE: {title}
 START: {start}
 END: {end}""".format(title=self.title, start=self.start, end=self.end)
 mail_admins(subject=subject, message=message, fail_silently=False)

在view中使用create_event()代替create()时, 便会通知管理员了.

在其他代码中验证model

如果你使用pre_save signal来验证某一model, 则应当尝试自己写一个validator取代之. 如果验证是通过ModelForm时, 通过改写clean()实现验证.

使用model的save()和delete()

如果使用pre_save 或 post_save signal, 如果可以, 则将这些代码移到model的save()方法中.

同样如果使用pre_delete 或 post_delete signal, 如果可以, 则将这些代码移到model的delte()方法中.

使用其他代码代替signal

如果可能, 我们可以将signal的逻辑使用其他帮助程序实现.

相关文章

  • python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例

    python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例

    这篇文章主要介绍了python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例,需要的朋友可以参考下
    2020-03-03
  • numpy数组切片的使用

    numpy数组切片的使用

    本文主要介绍了numpy数组切片的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Python虚拟环境virtualenv的安装与使用详解

    Python虚拟环境virtualenv的安装与使用详解

    virtualenv可以用来管理互不干扰的独立python虚拟环境,在有些场景下非常有用,下面这篇文章主要给大家介绍了Python虚拟环境virtualenv安装与使用的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-05-05
  • Python协程实践分享

    Python协程实践分享

    这篇文章主要分享的是Python协程实践,协程简单来说就是一个更加轻量级的线程,并且不由操作系统内核管理,完全由程序所控制,下文相关介绍需要的朋友可以参考一下
    2022-05-05
  • python数字图像处理实现图像的形变与缩放

    python数字图像处理实现图像的形变与缩放

    这篇文章主要为大家介绍了python数字图像处理实现图像的形变与缩放示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Python Pandas中rolling方法的使用指南

    Python Pandas中rolling方法的使用指南

    在数据分析和时间序列数据处理中,经常需要执行滚动计算或滑动窗口操作,Pandas库提供了rolling方法,用于执行这些操作,下面我们就来学习一下rolling方法的具体使用吧
    2023-11-11
  • 利用Python Matlab绘制曲线图的简单实例

    利用Python Matlab绘制曲线图的简单实例

    们经常会遇到这种情况,有一个数学函数,我们希望了解他的图像,这个时候使用python 的matplotlib就可以帮助我们,下面这篇文章主要介绍了利用Python Matlab绘制曲线图的相关资料,需要的朋友可以参考下
    2021-12-12
  • Python Pandas常用函数方法总结

    Python Pandas常用函数方法总结

    今天给大家带来的是关于Python的相关知识,文章围绕着Pandas常用函数方法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Vscode 远程切换Python虚拟环境的详细步骤

    Vscode 远程切换Python虚拟环境的详细步骤

    使用VSCode远程切换Python虚拟环境涉及安装VSCode和必要扩展、连接远程服务器、创建或激活虚拟环境,并选择对应Python解释器,详细步骤包括安装Python和Remote-SSH扩展,感兴趣的朋友一起看看吧
    2024-09-09
  • python 解决微分方程的操作(数值解法)

    python 解决微分方程的操作(数值解法)

    这篇文章主要介绍了python 解决微分方程的操作(数值解法),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05

最新评论