- ./project/:/usr/src/app/
environment:
- DEBUG=1
- SECRET_KEY=dbaa1_i7%*3r9-=z-+_mz4r-!qeed@(-a_r(g@k8jo8y3r27%m
- DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1] depends_on:
- redis
在构建新容器之前,我们需要在Django应用中配置Celery。
芹菜配置
设定
在“核心”目录中,创建一个celery.py文件并添加以下代码:
import os
from celery import Celery
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "core.settings")app = Celery("core")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()
这里发生了什么事?
首先,我们为DJANGO_SETTINGS_MODULE环境变量设置一个默认值,以便Celery知道如何找到Django项目。
接下来,我们创建了一个名称为core的新Celery实例,并将该值分配给名为app的变量。
然后,我们从django.conf的settings对象中加载了celery配置值。 我们使用namespace =“ CELERY”来防止与其他Django设置发生冲突。 换句话说,Celery的所有配置设置必须以CELERY_为前缀。
最后,
app.autodiscover_tasks()告诉Celery从settings.INSTALLED_APPS中定义的应用程序中查找Celery任务。将以下代码添加到core / __ init__.py:
from .celery import app as celery_app__all__ = ("celery_app",)
最后,使用以下Celery设置更新core / settings.py文件,使其可以连接到Redis:
CELERY_BROKER_URL = "redis://redis:6379"
CELERY_RESULT_BACKEND = "redis://redis:6379"build:
$ docker-compose up -d --build查看日志:
$ docker-compose logs 'web'
$ docker-compose logs 'celery'
$ docker-compose logs 'celery-beat'
$ docker-compose logs 'redis'如果一切顺利,我们现在有四个容器,每个容器提供不同的服务。
现在,我们准备创建一个示例任务,以查看其是否可以正常工作。
创建一个任务
创建一个新文件core / tasks.py并为仅打印到控制台的示例任务添加以下代码:
from celery import shared_task@shared_task
def sample_task():
print("The sample task just ran.")
安排任务
在settings.py文件的末尾,添加以下代码,以使用Celery Beat将sample_task安排为每分钟运行一次:
CELERY_BEAT_SCHEDULE = {
"sample_task": {
"task": "core.tasks.sample_task",
"schedule": crontab(minute="*/1"),
},
}在这里,我们使用CELERY_BEAT_SCHEDULE设置定义了定期任务。 我们给任务命名了sample_task,然后声明了两个设置:










