【问题标题】:Django template - Create a cron job to wish an happy birthdayDjango 模板 - 创建一个 cron 作业以祝生日快乐
【发布时间】:2017-01-26 17:29:49
【问题描述】:

我在 Django 中创建了一个模板,该模板具有祝客户生日快乐的功能。我想以这样的方式设置该消息,以便每年在客户生日时将其发送给客户。我认为最好的方法是创建一个 cron 作业。但是,我对 cron 作业不熟悉,希望得到您的帮助。

我创建了一个属性birthday_date,它将给我们的生日日期为day month。这是我到目前为止所做的:

#!/bin/bash

MANAGE="../venv/bin/python ../manage.py"

谁能告诉我该怎么做?

提前致谢!

【问题讨论】:

  • 你想怎样祝你生日快乐?通过发送电子邮件?
  • @aumo 是的,没错!

标签: django cron


【解决方案1】:

一个简单的解决方案是创建一个custom management command,它将发送当天的生日快乐电子邮件,并通过cronjob每天运行它。

这是一个示例自定义命令,您的可能会有所不同,具体取决于您存储用户数据的方式:

# app/management/commands/send_daily_birthday_greetings.py
"""
Custom management command that sends an email to all users
born on the current day and month.
"""

from django.core.management import BaseCommand
from django.core.mail import send_mail
from django.utils import timezone
from someplace import User



class Command(BaseCommand):
    def handle(self, **options):
        today = timezone.now().date()
        for user in User.objects.filter(birth_date__day=today.day, birth_date__month=today.month):
            subject = 'Happy birthday %s!' % user.first_name
            body = 'Hi %s,\n...' + user.first_name
            send_mail(subject, body, 'contact@yourdomain.com', [user.email])

然后使用crontab -e 编辑您的 crontab 配置:

# m h  dom mon dow   command
0 10 * * * /path/to/your/python/executable/python /path/to/your/manage.py send_daily_birthday_greetings

这将在每天 10:00 发送电子邮件,您可以根据需要更改时间。

【讨论】:

    【解决方案2】:

    在构建 aumo 的答案时,如果您要部署到 PaaS,例如 Heroku,并且无法安排 cron 作业,则可以使用 honcho 和管理命令的组合来安排您的定期任务。有时,将其全部保留在应用程序中而不是编辑其他系统文件(如 cron)也会很好。 honcho

    例如,您的 Procfile 可能如下所示:

    web: gunicorn config.wsgi:application
    tasks: honcho -f ProcfileHoncho start
    

    您的 honcho 文件可能如下所示:

    clock: python clock.py
    reports: python app_name/tasks/reports.py
    

    你的时钟文件调用管理命令:

    import os
    import subprocess
    from apscheduler.schedulers.blocking import BlockingScheduler
    
    sched = BlockingScheduler()
    
    # Morning updates. Times in UTC time.
    @sched.scheduled_job('cron', hour=11)
    def birthdays():
        os.system('python manage.py send_daily_birthday_greetings')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      相关资源
      最近更新 更多