В этом уроке по Django 4.1 мы рассмотрим добавление нашей кастомной команды по резервному копированию базы данных в исполнение по расписанию с помощью Celery.
Напоминаю, что советую посмотреть 2 урока перед выполнением 53 урока:
- Создание сайта на Django: Урок 50, асинхронные задачи, часть 1 (Установка Celery, Redis)
- Создание сайта на Django: Урок 51, асинхронные задачи, часть 2 (Отправка писем)
И сам код содержится в уроке для команды dbackup:
Создание сайта на Django: Урок 52, создание собственных команд (резервное копирование базы данных)
Создадим задачу для Celery
modules/system/services/tasks.py
from celery import shared_task
from celery.utils.log import get_task_logger
from django.core.management import call_command
from modules.system.services.email import send_activate_email_message
logger = get_task_logger(__name__)
@shared_task
def send_activate_email_task(email):
"""
1. Получение из view регистрации
2. Отправка через функцию send_activate_email_message
"""
return send_activate_email_message(email)
@shared_task()
def db_backup_task():
"""
Выполнение резервного копирования базы данных
"""
logger.info('Backup database starting')
call_command('dbackup',)
Пояснение:
- Добавил код из файла целиком, с контентом из прошлых уроков.
- Создали функцию
db_backup_task()
, в которой вызывается командаdbackup
Для того, чтобы добавить задачу по расписанию, мы должны добавить определенный конфиг в конфигурационный файл Django проекта.
backend/settings.py
CELERY_BEAT_SCHEDULE = {
'dbackup_task': {
'task': 'modules.system.services.tasks.db_backup_task',
'schedule': crontab(minute=0, hour=0),
},
}
Пояснение:
- Создаем конфиг с переодическими задачами.
- Задача
dbackup_task
, будет выполняться каждый день в полночьcrontab(minute=0, hour=0)
. - Путь к задаче:
modules.system.services.tasks.db_backup_task
И просто запускаем наш проект с Celery, но запускаем его уже с новым флагом:
celery -A backend worker -B --loglevel=info
Флаг -B
активирует работу Celery по расписанию.
[tasks]
. modules.system.services.tasks.db_backup_task
. modules.system.services.tasks.send_activate_email_task
При запуске Celery мы видим, что задача зарегистрирована в списке задач. А значит, каждую полночь она будет запускаться.
После запуска работы Celery по расписанию с флагом -B
, у вас также в корне проекта появится файл: celerybeat-schedule
Подробнее о задачах можно почитать на официальном сайте Celery