Найти в Дзене

Как подключить Celery к проекту на Django

Celery — это асинхронный брокер задач для Python, который позволяет выполнять задачи в фоновом режиме, такие как отправка email, обработка изображений, выполнение долгих вычислений и многое другое. В этой статье я расскажу, как интегрировать Celery с проектом на Django, чтобы он мог обрабатывать задачи асинхронно и эффективно. Прежде чем настроить Celery, нужно установить необходимые библиотеки. В вашем Django проекте добавьте зависимости в файл requirements.txt или в pyproject.toml, если вы используете Poetry. pip install celery redis celery — сам брокер задач.
redis — один из популярных брокеров сообщений, который будет использоваться для хранения задач. Если вы используете Poetry, то добавьте их в ваш проект: poetry add celery redis Celery использует брокер сообщений для очередей задач. В этом примере мы будем использовать Redis. 1. Убедитесь, что Redis установлен и работает. Для этого можно использовать Docker. docker-compose up redis Пример конфигурации Redis в docker-compose.yml:
Оглавление

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. Вы можете выполнять задачи в фоновом режиме, не блокируя основной поток вашего приложения, и обрабатывать их по мере необходимости.