我正在构建一个客户培养应用程序,当订单满足某些基于时间的条件时,该应用程序将发送电子邮件,例如:
订单 time_to_ship 已过 50%
订单发货日期后 10 天
新闻通讯订阅者signup_date后5天
我正在尝试确定如何最好地触发和处理这些事件。我没有处理这个问题的经验,因此欢迎任何意见。
当前想法:轮询每个处理程序的匹配项,并确保每个处理程序匹配组合仅通过额外的表触发一次。在这种情况下,我不会触发可以在其他地方监听的事件,每个处理程序都在执行自己的查询。 5 天后...
的 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 作业,而不是处理程序,但我认为我必须跟踪触发的每个事件以确保我不会触发2,或者没有跳过该事件(假设由于停机而跳过了 20% 的事件)。这将比已触发的记录处理程序存储更多数千条记录,但感觉更像是一个真正的事件发射器。
最佳答案
Django async 是一个异步执行队列。您可以安排一个 future 的事件,然后该事件将检查条件当时是否有效。例如,当订单发货时,安排一个在 10 天后触发的事件,当该事件执行时,它可以在发送电子邮件之前确保任何其他条件。
http://pypi.python.org/pypi/django-async/
Django 异步内置了运行一次行为,如果队列因任何原因停止,它将在重新启动时 catch 过去的作业。暂时性错误(例如 SMTP 服务器关闭)将自动重试。
关于python - 健全性检查 : date driven event handler with django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11444488/