Django База [2023]: Установка Redis и Celery для асинхронных задач 💿 #44
В этой статье мы рассмотрим установку Redis для кэширования и настроим Celery для будущих асинхронных задач в Django.
Если вы хотите выразить благодарность автору сайта, статей и курса по 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 в 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:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': (BASE_DIR / 'cache'),
}
}
Меняем на / добавляем следующий код:
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 закончили, перейдем к установке и настройке 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 со следующим содержимым:
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.
# 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, можно в любое место:
# 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.