python - Django - 如何在事件前 5 天发送邮件?

标签 python django task jobs

我是初级 Django 开发人员。得到了我的第一个项目。做得很好,但教我的高级开发人员去度假了....

我公司的任务是创建一个功能,在事件开始前 5 天通过发送邮件提醒特定组中的所有人。

有一个 TournamentModel,它包含一个 tournament_start_date,例如 '10.08.2018'

玩家可以参加锦标赛,当他加入 django 组“Registered”时。

我必须创建一个函数(工作?)来检查tournament_start_date,如果锦标赛在 5 天后开始,这个函数将向“Registered”中的所有人发送电子邮件"分组...自动。

我该怎么做?我应该使用什么?如何运行它,它会自动检查?我正在学习 python/django 几个月......但我第一次遇到工作;/

我将不胜感激。

最佳答案

如果将其分解为两部分,会更容易。零件是

  1. 发送提醒邮件
  2. 每天运行脚本

对于第一部分,我将从安装出色的 django-extensions 开始包以便于运行脚本。 (检查您的 INSTALLED_APPS,您可能已经安装了它。)有了 python-dateutil包也会有帮助。

然后我会写我的脚本。假设您的应用名为“myapp”。在“myapp”下创建一个名为“scripts”的目录,并在其中创建一个空的 __init__.py。

现在在“myapp/scripts/remind_players.py”中创建脚本文件。它看起来像这样:

from datetime import date
from datutil.relativedelta import relativedelta
from django.mail import send_mail  # I think this is right.
from myapp.models import Tournament

def run():
    # find our tournaments that start five days from now.
    for tournament in Tournament.objects.filter(tournament_start_date=date.today() + relativedelta(days=5)):

        # find the players that are registered for the tournament
        for player in tournament.registered_player_set():
            send_mail(...)

要手动运行脚本,您可以运行

python manage.py runscript remind_players

(提示:确保您的测试数据库只包含您自己的电子邮件地址。让您的测试系统向所有人发送电子邮件会很尴尬。)

(提示:您还可以配置 Django 将电子邮件消息放入日志中,而不是实际发送它们。)

对于第二部分,您必须找到一种方法来安排作业每天运行。通常,您的操作系统会提供一种方法来做到这一点。如果您使用的是 Unix/Linux,您将使用“cron”。如果您使用的是 Windows,您将使用“计划任务”。 (还有其他调度选项,但这些是最常见的。)

关于python - Django - 如何在事件前 5 天发送邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51379567/

相关文章:

python - 将灰色背景转换为白色背景而不干扰原始图像

python - 如何检查python中是否存在文件?

python - GAE 上的 B2B 应用程序身份验证 - Google 帐户或自定义用户群(Django 或 Web2Py)?

c# - Xamarin Forms 异步播放声音

python - jupyter 模块未找到错误 : No module named matplotlib

python - 为什么事情是[:][0] equal to thing[0][:]?

django - 需要帮助使用 xhtml2pdf 从模板以 pdf 格式呈现图像

python - Celery 中如何执行 rate_limit?

algorithm - 总和为S的最小硬币数

c# - 从 QueueUserWorkItem 移动到任务