Celery Redis Flower - NurOrNuLL/ESDP-AP-5-6-TEAM-2 GitHub Wiki

Django и Celery. Установка

  • Celery

Это распределенная асинхронная очередь заданий, которая обладает широким функционалом. В web приложениях нам часто приходиться запускать асинхронные с точки зрения ответа пользователю задачи.

  • Redis

Брокер сообщений - это хранилище, которое взаимодействует как транспорт между производителем и потребителем. Бэкэнд результатов - это хранилище, в котором сохраняется информация о результатах и ​​ошибках или задача Celery. Redis рекомендуется как брокер для celery.

  • Flower

может позволить нам отслеживать Celery на удобной для пользовательского интерфейса веб-странице, потому что это может помочь нам лучше понять более подробную информацию о Celery, поэтому я решил поговорить об этом, прежде чем углубляться в дальнейшие исследования.

Как настроить celery, redis, flower

  1. Celery pip install celery ссылка на документацию
  2. Redis pip install redis ссылка на документацию
  3. Flower pip install flower ссылка на документацию
  • В корневой папке настроек Django (например: она называется core) в вашем проекте создаете файл celery.py и туда записываете настройки описанные ниже
import os

from celery import Celery

# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')

app = Celery('core')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django apps.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')
  • В той же папке в файле init.py записываем следующие настройки :
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)
  • В core/settings.py для того чтобы иметь возможность запускать проект можем записать дополнительные настройки для worker-a. Worker, это процесс celery который собственно получает задания из очереди и выполняет их.
REDIS_HOST = '0.0.0.0'
REDIS_PORT = '6379'
CELERY_BROKER_URL = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
CELERY_BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600}
CELERY_RESULT_BACKEND = 'redis://' + REDIS_HOST + ":" + REDIS_PORT + '/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

Как навесить задачи для celery

  • Например есть приложение в котором при обновлении страницы в папку cats загружаются фотографии котиков. В данном приложении создаем файл tasks.py и с celery импортирем task или через декоратор @app.task() закрепляем к выполняемой функции загрузки задачу
# Create your tasks here
import requests as r
import uuid

from celery import shared_task
from django.conf import settings

CAT_URL = 'https://thecatapi.com/api/images/get?format=src&type=gif'
from core.celery import app


@app.task()
def download_a_cat():
    resp = r.get(CAT_URL)
    file_ext = resp.headers.get('Content-Type').split('/')[1]
    path = settings.BASE_DIR / 'cats' / (str(uuid.uuid4()) + "." + file_ext)
    with open(path, 'wb') as f:
        for chunk in resp.iter_content(chunk_size=128):
            f.write(chunk)
    return True

Далее в приложении в views.py импортирему задачи и закрепляем к view функцию задачи по методу delay()

from django.http import HttpResponse

# Create your views here.
from . import tasks


def home(request):
    tasks.download_a_cat.delay()
    return HttpResponse('<h1>I loading cats</h1>')

Запуск приложения с celery redis flower

  • запуск можно произвести в нескольких терминалах

Терминал 1 Запускаем проект как обычно python manage.py runserver

Терминал 2 Запускаем celery worker celery -A core worker -l info

Терминал 3 Запускаем celery flower celery -A core flower --adsress=127.0.0.6 --port=5556

Пример работы Celery Flower

⚠️ **GitHub.com Fallback** ⚠️