python - django用芹菜任务发送电子邮件
问题描述
如果订单的截止日期是今天,我想自动向具有特定订单的 order.id 和“manu_date”的用户发送电子邮件。我已经用 rabbitmq 配置了 celery,它正在工作,我可以发送电子邮件。问题是我不知道任务和视图会包含什么。到目前为止,我已经想出了下面的代码。
@periodic_task(run_every=datetime.timedelta(minutes=1))
def check_for_orders():
orders = Order.objects.all()
now = datetime.datetime.utcnow().replace(tzinfo=utc,second=00, microsecond=00)
for order in orders:
if order.manu_date == now:
send_mail('Manufacturing Reminder',
'{{Order.id}} is due {{manu_date}}',
'dummyguy1680@gmail.com',
['gummy@gmail.com.com'])
return None
class Order(models.Model):
date = models.ForeignKey('date', null=True, on_delete=models.CASCADE)
user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
name = models.CharField(max_length=30)
date_created = models.DateTimeField('date_created', default=timezone.now(), blank=False)
manu_date = models.DateField('Manufacturing', null=True)
updated_by = models.ForeignKey(User, null=True, related_name='updated_by_user', on_delete=models.CASCADE)
date_updated = models.DateField(max_length=100, null=True)
解决方案
您可以通过设置每天运行的crontabCelery Beat
并使用. 要进行此设置,一种方法是:
设置.py
from celery.schedules import crontab
CELERY_BROKER_URL = <broker_address> 'for example 'amqp://myuser:mypassword@localhost:5672/myvhost'
CELERY_TIMEZONE = <your_timezone> #for example 'Europe/London'
CELERY_IMPORTS = ['<app_name>.tasks']
CELERY_BEAT_SCHEDULE = {
'celery_test': {
'task': '<app_name>.tasks.check_for_orders',
'schedule': crontab(minute=0, hour=0), #every day at midnight
},
}
将所有<>
变量替换为您的应用程序所需的变量。
任务.py
from celery import shared_task
@shared_task
def check_for_orders():
orders = Order.objects.all()
now = datetime.datetime.utcnow().replace(tzinfo=utc,second=00, microsecond=00)
week_old = now - datetime.timedelta(week=1)
for order in orders:
if order.manu_date.date() == week_old.date():
send_mail('Manufacturing Reminder',
'{} is due {}'.format(order.id, order.manu_date),
'dummyguy1680@gmail.com',
['gummy@gmail.com.com'])
return None
确保 celery beat 与 worker 和应用程序并行运行。
终端运行 Celery Beat
celery -A EmissionsWorkbench beat -l info
推荐阅读
- php - 数据库 ORM 原则 Symfony 4
- python - 用于将大数的相邻数字相乘并找到最大可能乘积的 Python 代码,但未给出所需结果
- java - Spring数据jpa存储库检索多个计数
- javascript - 如何从 iFrame 中获取文本值
- firebase - 使用 Admin SDK 发送超过 1000 条通知 - Firebase Cloud Messaging
- python - 如何使用 opencv 将 Monospace 字体插入图像中?
- c++ - 使用stl和没有节点c ++的霍夫曼编码
- sqlite - AnKo SQLite:从数据库异步填充列表视图?
- r - Syuzhet 与 SentimentR 的否定词和修饰符用于 R 中的情绪分析
- c# - 如何在 1 秒 Unity 3D 后停止功能?