【问题标题】:Pythonic solution for writing management commands用于编写管理命令的 Pythonic 解决方案
【发布时间】:2013-05-23 18:09:36
【问题描述】:

我正在使用 django 1.3 和 python 2.7。

客户要求:

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

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

模型.PY:

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

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

Class Preference 仅包含时间偏好,即每天、每周、每月

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

问题:

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

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

【问题讨论】:

    标签: python django django-models cron


    【解决方案1】:
    1. 由于您有预定义的时间间隔(每天、每周、每月),您只需一个命令即可处理所有事情。

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

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

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

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

    【讨论】:

    • 所以基本上你同意这个想法?我正朝着正确的方向前进?
    • 是的,我也想忽略 django-celery 和 rabbitMQ。
    【解决方案2】:
    1. 我会创建一个命令(作为入口点),因为它更容易在 cron 中注册

    2. 是的,保留最后发送的电子邮件将是有益的,保留添加首选项的时间也可能是有益的,django 为此提供了auto_now_add。任何可以帮助您顺利进行的信息,或提供有关用户操作的更多信息

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

    4. 管理命令,具有结构良好/经过深思熟虑的内部功能

    【讨论】:

    • Karthikr 和您的答案几乎相同,但他首先回答,因此,我接受了他的答案,尽管两者都投了赞成票。谢谢:)
    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多