完整性检查:使用django的日期驱动事件处理程序

时间:2012-07-12 03:06:33

标签: python django

我正在构建一个客户培育应用程序,该应用程序将在以下订单满足某些基于时间的条件时发送电子邮件:

  • 50% OF Order time_to_ship elapsed
  • 10 DAYS AFTER Order ship_date
  • 5 DAYS AFTER NewsletterSubscriber signup_date

我试图确定如何最好地触发处理这些事件。我没有处理这个问题的经验,所以感谢任何输入。

当前的想法:对每个处理程序的匹配进行轮询,并确保每个处理程序匹配组合仅通过额外的表触发一次。在这种情况下,我不会触发我可以在其他地方收听的事件,每个处理程序都在执行自己的查询。 5 days after ...上的3个处理程序将触发3个查询。

#  build table that stores which handlers have fired for a given object 
class HandlerFired(models.Model):
    ctype = models.ForeignKey(ContentType, related_name="handlerfired_ctype")
    id = models.IntegerField()
    handler = models.ForeignKey(Handler)

class Handler(models.Model):
    ctype = models.ForeignKey(ContentType)
    condition = ...

#  cron job every day 
for handler in Handler.objects.filter(is_active=True):
    objects = handler.run_query().exclude(
         handlerfired=handler, handlerfired_ctype=handler.ctype)
    handler.handle(objects) # do whatever it's supposed to do with given objects.
    # handle() would also make sure the `HandlerFired` table is populated with a record.

这个想法给了我比我开始项目时想象的更多的悲伤/选择。有时间驱动的事件似乎是一个非常普遍的问题。

或者,我可以做事件而不是处理程序的每日cron工作,但我认为我必须跟踪每个被解雇的事件,以确保我没有' t fire 2,或者没有跳过(因为停机时跳过了20%的事件)。这将比已经解雇的录制处理程序存储数千条记录,但感觉更像是真正的事件发射器。

2 个答案:

答案 0 :(得分:4)

Django async是一个异步执行队列。您可以安排将来的事件,然后检查该条件是否有效。例如,当订单发货时,计划10天后触发的事件以及执行该事件时,可以在发送电子邮件之前确保其他任何条件。

http://pypi.python.org/pypi/django-async/

Django async内置了一次运行行为,如果队列因任何原因停止运行,它将在重新启动时赶上过去的作业。将自动重试瞬态错误(如SMTP服务器关闭)。

答案 1 :(得分:0)

我会创建一个django管理命令来执行您需要的任何处理,然后分配一个cronjob来定期执行它。

然后,您可能需要一个模型来跟踪是否已满足/处理条件,和/或哪些记录触发了该事件。