Django База [2023]: Установка Redis и Celery для асинхронных задач 💿 #44
Django

Django База [2023]: Установка Redis и Celery для асинхронных задач 💿 #44

Razilator

В этой статье мы рассмотрим установку Redis для кэширования и настроим Celery для будущих асинхронных задач в Django.

Redis - это быстрая и надежная система хранения данных, которая может использоваться для кэширования данных, управления сеансами и кэширования результатов запросов к базе данных.

Celery - это инструмент, который позволяет запускать асинхронные задачи в Django, например, отправку электронных писем или обработку фоновых задач.

Установка сервера Redis на Windows

Здесь есть 3 варианта установки, которые знаю я. Это установка через Docker, запуск Redis из пака OpenServer, либо запуск Redis из среды Linux на вашей Windows.

Я запущу Redis быстро из Docker. Все равно он нам будет необходим для будущего деплоя.

Вы можете установить Docker с официального сайта. После установка Docker, запустите его, если потребуется, установите WSL2 для его корректной работы.

После запуска Docker, прямо в терминале вашего IDE редактора (у нас это VSCODE) открытый с проектом Django введите следующие команды: docker pull redis:latest и docker run --name redis-server -p 6379:6379 -d redis:latest

Выполнение команд в терминале
Выполнение команд в терминале
Сервер Redis запущен
Сервер Redis запущен

Отлично. Перейдем к установке Redis в Django.

Установка пакета Redis в Django

Для использования Redis в Django необходимо установить пакет redis для Python. Это можно сделать с помощью pip: pip install redis

Результат установки:

Терминал
(venv) PS C:\Users\Razilator\Desktop\Base\backend> pip install redis
Collecting redis
  Using cached redis-4.5.1-py3-none-any.whl (238 kB)
Collecting async-timeout>=4.0.2
  Using cached async_timeout-4.0.2-py3-none-any.whl (5.8 kB)
Installing collected packages: async-timeout, redis
Successfully installed async-timeout-4.0.2 redis-4.5.1

[notice] A new release of pip available: 22.3 -> 23.0.1
[notice] To update, run: python.exe -m pip install --upgrade pip

Теперь давайте добавим настройки для кэширования Redis. В одном из уроков мы уже добавляли настройки для кэширования в конфигурационный файл settings.py:

backend/settings.py
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': (BASE_DIR / 'cache'),
    }
}

Меняем на / добавляем следующий код:

backend/settings.py
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.redis.RedisCache',
        'LOCATION': 'redis://localhost:6379',
    }
}

Здесь мы указываем, что используем Redis как бэкенд для кэширования.

Примечание: не находясь внутри контейнера, мы стучимся к Redis по localhost:6379, но если мы будем использовать его в среде Docker, где Django будет находиться тоже в контейнере, нам необходимо будет использовать следующий адрес redis://redis:6379, но об этом позже в уроке по деплою.

Дополнительно: если вы проходили урок по созданию статуса онлайн, оффлайн в Django, можете удалить папку cache из проекта.

Запустим сайт: py manage.py runserver, чтобы удостовериться, все ли настроили правильно.

Все работает
Все работает

И если посмотреть профиль пользователя, где мы использовали кэширование для статуса, можно убедиться, что кэш работает из Redis:

Кэширование работает на Redis
Кэширование работает на Redis

На этом с Redis закончили, перейдем к установке и настройке Celery.

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

Установим Celery с помощью следующей команды pip: pip install celery.

Результат установки Celery:

Терминал
(venv) PS C:\Users\Razilator\Desktop\Base\backend> pip install celery
Collecting celery
  Using cached celery-5.2.7-py3-none-any.whl (405 kB)
Collecting pytz>=2021.3
  Using cached pytz-2022.7.1-py2.py3-none-any.whl (499 kB)
Collecting billiard<4.0,>=3.6.4.0
  Using cached billiard-3.6.4.0-py3-none-any.whl (89 kB)
Collecting kombu<6.0,>=5.2.3
  Using cached kombu-5.2.4-py3-none-any.whl (189 kB)
Collecting vine<6.0,>=5.0.0
  Using cached vine-5.0.0-py2.py3-none-any.whl (9.4 kB)
Collecting click<9.0,>=8.0.3
  Using cached click-8.1.3-py3-none-any.whl (96 kB)
Collecting click-didyoumean>=0.0.3
  Using cached click_didyoumean-0.3.0-py3-none-any.whl (2.7 kB)
Collecting click-repl>=0.2.0
  Using cached click_repl-0.2.0-py3-none-any.whl (5.2 kB)
Collecting click-plugins>=1.1.1
  Using cached click_plugins-1.1.1-py2.py3-none-any.whl (7.5 kB)
Collecting colorama
  Using cached colorama-0.4.6-py2.py3-none-any.whl (25 kB)
Collecting prompt-toolkit
  Downloading prompt_toolkit-3.0.38-py3-none-any.whl (385 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 385.8/385.8 kB 1.7 MB/s eta 0:00:00
Collecting six
  Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting amqp<6.0.0,>=5.0.9
  Using cached amqp-5.1.1-py3-none-any.whl (50 kB)
Collecting wcwidth
  Using cached wcwidth-0.2.6-py2.py3-none-any.whl (29 kB)
Installing collected packages: wcwidth, pytz, billiard, vine, six, prompt-toolkit, colorama, click, amqp, kombu, click-repl, click-plugins, click-didyoumean, celery
Successfully installed amqp-5.1.1 billiard-3.6.4.0 celery-5.2.7 click-8.1.3 click-didyoumean-0.3.0 click-plugins-1.1.1 click-repl-0.2.0 colorama-0.4.6 kombu-5.2.4 prompt-toolkit-3.0.38 pytz-2022.7.1 six-1.16.0 vine-5.0.0 wcwidth-0.2.6

[notice] A new release of pip available: 22.3 -> 23.0.1
[notice] To update, run: python.exe -m pip install --upgrade pip

Отлично. Celery установлен, теперь необходимо его настроить.

Настройка Celery в Django

В главной папке проекта backend, где хранится файл settings.py нам необходимо создать файл celery.py со следующим содержимым:

backend/celery.py
import os

from celery import Celery

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

app = Celery('backend')

# 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()

Здесь мы указываем, что настройки для Celery мы будем брать из namespace 'CELERY' в settings.py. Также мы автоматически ищем файлы tasks.py во всех приложениях Django, которые используют Celery.

Далее нам необходимо добавить обработку Celery в файл init.py, который находится также в папке backend.

backend/__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',)

Добавим настройки для Celery в settings.py, можно в любое место:

backend/settings.py
# Celery settings

CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Europe/Moscow'

Здесь мы указываем, что Celery будет использовать Redis в качестве брокера сообщений и хранилища результатов.

Мы также указываем, что используем JSON для сериализации результатов и задач. Если вы хотите использовать другой формат сериализации, то вам необходимо заменить json на другое значение.

Запуск Celery в Django

Давайте запустим Django и во втором терминале запустим Celery.

В первом терминале запускаем Django: py manage.py runserver.

Во втором терминале также с включенным виртуальным окружением и находясь в корневой папке вводим следующую команду celery -A backend worker -l info для запуска Celery.

Выглядит вся структура следующим образом
Выглядит вся структура следующим образом

И у нас все запускается, все работает. Дальше в уроках мы рассмотрим задачи для асинхронной обработки с помощью Celery и Redis.

;