08:21 2020/09/14

Фоновые задачи в Django

Если появилась потребность завести в своем приложении периодические задачи или фоновые задачи, но не хочется использовать для этого тяжелые сервисы, типа Celery, то на помощь может придти пакет попроще - django-background-tasks.

После установки предлагается создать функцию-таск, обернув ее в декоратор @background. Затем можно эту функцию вызвать откуда-то и она начнет выполняться периодически в указанный в декораторе промежуток времени. Вроде все отлично, но как же быть, если фоновая задача должна выполняться сразу же после старта приложения?

Не нашел в документации ответ на этот вопрос, поэтому сделал свое решение. Для этого в каталоге модуля создается файл apps.py с примерно следующим содержимым:

Как видно из кода, при запуске команды process_tasks - дропаются висящие в очереди задачи и создаются заново. Не забываем теперь вместо some_app из INSTALLED_APPS в файле настроек Django settings.py прописать some_app.apps.CustomAdminConfig. Теперь осталось запустить демона, которые будет контролировать выполнение команды python manage.py process_tasks. Сделать это можно, например, через supervisor.