python - 健全性检查 : date driven event handler with django

标签 python django

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

  • 订单 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/

相关文章:

django - 高级 Django 查询

Django 通用 View UpdateView 重定向 URL 与更新的 slug

python - 如何使用numpy计算向量滚动窗口的相关系数?

python - pycharm 中的“预期语句结束”

python - Django F 字段迭代

mysql - 您将如何根据以下数据设计数据库关系......?

python - 有限的 celery 节拍任务

python - socket.recvfrom(1024) 抛出 socket.error 提供的参数无效

python - 无法从 'save_virtual_workbook' 导入名称 'openpyxl.writer.excel'

python - 如何将数据重定向到 "getpass"之类的密码输入?