如何使用Celery和Docker处理Django中的定期任务

2020-06-17 07:27:11易采站长站整理

添加一个虚拟管理员电子邮件,并将EMAIL_BACKEND设置为使用控制台后端,以便将该电子邮件发送到设置文件中的stdout:


EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
DEFAULT_FROM_EMAIL = "noreply@email.com"
ADMINS = [("testuser", "test.user@email.com"), ]

运行:

$ docker-compose exec web python manage.py email_report
Content-Type: text/plain; charset=”utf-8″
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: [Django] Order Report for 2020-04-15 to 2020-04-16
From: root@localhost
To: test.user@email.com
Date: Wed, 15 Apr 2020 23:10:45 -0000
Message-ID: <158699224565.85.8278261495663971825@5ce6313185d3>
 
Order: 337ef21c-5f53-4761-9f81-07945de385ae – product: Rice
 
——————————————————————————-
E-mail Report was sent.

Celery Beat

现在,我们需要创建一个定期任务来每天运行此命令。

向core / tasks.py添加一个新任务:


from celery import shared_task
from django.core.management import call_command # NEW

@shared_task
def sample_task():
print("The sample task just ran.")

# NEW
@shared_task
def send_email_report():
call_command("email_report", )

因此,首先我们添加了一个call_command导入,该导入用于以编程方式调用django-admin命令。 在新任务中,然后将call_command与自定义命令的名称一起用作参数。

要安排此任务,请打开core / settings.py文件,并更新CELERY_BEAT_SCHEDULE设置以包括新任务。


CELERY_BEAT_SCHEDULE = {
"sample_task": {
"task": "core.tasks.sample_task",
"schedule": crontab(minute="*/1"),
},
"send_email_report": {
"task": "core.tasks.send_email_report",
"schedule": crontab(hour="*/1"),
},
}

在这里,我们向CELERY_BEAT_SCHEDULE添加了一个名为send_email_report的新条目。 正如我们对上一个任务所做的那样,我们声明了该任务应运行的任务-例如core.tasks.send_email_report-并使用crontab模式设置重复性。

重新启动容器,以确保新设置处于活动状态:


$ docker-compose up -d --build
看日志:
$ docker-compose logs -f 'celery'
celery_1 | -------------- [queues]celery_1 | .> celery exchange=celery(direct) key=celery
celery_1 |
celery_1 |
celery_1 | [tasks]celery_1 | . core.tasks.sample_task
celery_1 | . core.tasks.send_email_report

一分钟后邮件发出:

celery_1  | [2020-04-15 23:20:00,309: WARNING/ForkPoolWorker-1] Content-Type: text/plain; charset=”utf-8″