用于编写管理命令的Pythonic解决方案

时间:2013-05-28 17:06:55

标签: python django django-models cron

我正在使用django 1.3和python 2.7。

客户要求:

我有一个客户要求,该要求说明应根据用户的偏好为用户生成针对用户活动的电子邮件。这些偏好基于时间,因此可以是每日,每周或每月。

首选项是多选的,这意味着一个用户可以接收例如每日和每周通知。

MODELS.PY:

class Preference(models.Model):
    description = models.CharField(max_length=200)

class Notification(models.Model):
    user = models.ForeignKey(User)
    preferences = models.ManyToManyField(Preference)

班级偏好仅包含时间偏好,即每日,每周,每月

类通知会保留特定用户的偏好。管理命令将使用此表向用户发送电子邮件。

问题:

在编写管理命令时我有些疑惑。

  1. 我应该只编写一个命令来处理所有3个或更多个案例或每个案例1个命令吗?
  2. 我应该向偏好模型添加任何进一步的信息。例如,应该发送每日邮件的小时数?
  3. cron是否负责根据时间偏好运行命令?
  4. 解决这个问题最灵活的方式是什么(如果有人想建议的话)?

2 个答案:

答案 0 :(得分:1)

  1. 由于您有预定义的时间间隔(每天,每周,每月),您可以只使用一个处理所有内容的命令。

  2. 您可能希望包含一个字段,用于跟踪上次发送电子邮件的时间,该字段会在每次向用户发送电子邮件时更新。

  3. 不,cron就像一个轮询系统 - 如果某些条件有效,则执行一段代码。但是,开发人员可以定义cron执行的时间和频率

  4. 为简单起见,我会将其作为简单的直接管理命令来实现。如果真的很复杂,可以考虑使用django-celery(我宁愿保持简单)

  5. 您可以做的另一件事是向管理命令添加选项,如果您想要更多灵活性,它可以更好地控制诸如 - 仅针对preference_type=daily或特定用户的运行命令等。

答案 1 :(得分:1)

  1. 我会创建一个命令(作为入口点),因为它更容易在cron中注册

  2. 是的,保留上次发送的电子邮件只不过是有益的,保留添加偏好的时间也可能是有益的,django为此目的提供auto_now_add。任何可以帮助您自己的信息,或提供有关用户操作的更多信息

  3. Cron将在一定时间间隔内注册运行,它可以作为管理命令的“入口点”。它每隔X分钟就会为某个用户调用管理命令。管理员应该实施所涉及的逻辑,以确定是否已经发送了电子邮件

  4. 管理命令,具有结构良好/精心设计的内部功能