Celery — это асинхронный брокер задач для Python, который позволяет выполнять задачи в фоновом режиме, такие как отправка email, обработка изображений, выполнение долгих вычислений и многое другое. В этой статье я расскажу, как интегрировать Celery с проектом на Django, чтобы он мог обрабатывать задачи асинхронно и эффективно.
Шаг 1. Установка зависимостей
Прежде чем настроить Celery, нужно установить необходимые библиотеки. В вашем Django проекте добавьте зависимости в файл requirements.txt или в pyproject.toml, если вы используете Poetry.
pip install celery redis
celery — сам брокер задач.
redis — один из популярных брокеров сообщений, который будет использоваться для хранения задач.
Если вы используете Poetry, то добавьте их в ваш проект:
poetry add celery redis
Шаг 2. Настройка Redis
Celery использует брокер сообщений для очередей задач. В этом примере мы будем использовать Redis.
1. Убедитесь, что Redis установлен и работает. Для этого можно использовать Docker.
docker-compose up redis
Пример конфигурации Redis в docker-compose.yml:
redis:
image: redis:7-alpine
ports:
- 6379:6379
Шаг 3. Создание конфигурации Celery в Django
Теперь настроим Celery в вашем Django проекте.
1. В корне вашего Django проекта создайте файл celery.py (рядом с файлом settings.py).
# myproject/celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# Устанавливаем Django settings модуль для Celery.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')
# Используем строку для запуска задачи.
# Это позволяет избежать циклического импорта.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Загружаем все задачи, зарегистрированные в приложениях Django.
app.autodiscover_tasks()
Здесь:
- DJANGO_SETTINGS_MODULE — это стандартный путь к настройкам Django.
- app.config_from_object загружает все настройки из settings.py.
- app.autodiscover_tasks() позволяет Celery автоматически находить задачи, определённые в ваших приложениях Django.
2. Теперь нужно импортировать Celery в файл __init__.py вашего проекта, чтобы он был доступен при запуске проекта.
# myproject/__init__.py
from __future__ import absolute_import, unicode_literals
# Это нужно, чтобы Celery запустился при старте Django.
from .celery import app as celery_app
__all__ = ('celery_app',)
Шаг 4. Настройка в settings.py
Теперь в вашем settings.py файле добавим настройки для Celery.
1. Укажите настройки для использования Redis как брокера задач:
# myproject/settings.py
# Конфигурация Celery
CELERY_BROKER_URL = 'redis://localhost:6379/0' # Укажите свой адрес Redis
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
Здесь:
- CELERY_BROKER_URL — указывает, что Redis будет использоваться как брокер.
- CELERY_ACCEPT_CONTENT и CELERY_TASK_SERIALIZER настраивают сериализацию сообщений.
Шаг 5. Создание задач Celery
Теперь можно создавать задачи, которые будут выполняться асинхронно.
1. В любом из ваших приложений Django создайте файл tasks.py (например, в приложении myapp):
# myapp/tasks.py
from celery import shared_task
@shared_task
def send_welcome_email(user_email):
# Здесь будет код для отправки email
print(f"Отправка приветственного email на {user_email}")
# Для реальной отправки используйте Django Email API
2. Добавьте задачу в очередь:
from myapp.tasks import send_welcome_email
# Отправляем email в фоновом режиме
send_welcome_email.delay(user_email="example@example.com")
Шаг 6. Запуск Celery Worker
После того как задачи созданы, нужно запустить Celery worker для обработки этих задач.
1. Для этого откройте терминал и выполните команду:
celery -A myproject worker --loglevel=info
Если вы используете Docker, то можно добавить это в docker-compose.yml:
celery:
build:
context: ..
dockerfile: infrastructure/Dockerfile
command: poetry run celery -A myproject worker --loglevel=info
volumes:
- ../api:/app/api
env_file:
- .env
depends_on:
- redis
- db
Шаг 7. Запуск задач через Celery
Теперь задачи, которые вы определили, можно будет запускать через Celery, и они будут выполняться асинхронно.
Вы можете запустить задачи вручную с помощью метода delay() в любом месте вашего проекта:
# В вашем Django представлении или модели
send_welcome_email.delay(user_email="test@example.com")
Шаг 8. Настройка периодических задач (необязательно)
Celery поддерживает выполнение периодических задач через Celery Beat. Чтобы настроить периодические задачи, нужно добавить несколько строк в settings.py.
1. Установите дополнительные зависимости:
pip install celery[redis]
2. Добавьте в settings.py:
CELERY_BEAT_SCHEDULE = {
'send_email_every_day': {
'task': 'myapp.tasks.send_welcome_email',
'schedule': crontab(minute=0, hour=0), # Это выполнится каждый день в полночь
'args': ('test@example.com',),
},
}
3. Запустите Celery Beat:
celery -A myproject beat --loglevel=info
Заключение:
Теперь ваш Django проект настроен для асинхронной обработки задач с использованием Celery и Redis. Вы можете выполнять задачи в фоновом режиме, не блокируя основной поток вашего приложения, и обрабатывать их по мере необходимости.