Интеграция с Django¶
Эта страница описывает архитектурные принципы интеграции QTasks с Django. Речь идёт не о пользовательском API, а о том, как QTasks встраивается в модель загрузки Django и каким образом задачи становятся доступными фреймворку без жёсткой связки компонентов.
Архитектурный контекст Django¶
Django обладает собственной моделью инициализации приложения:
- список приложений определяется через
INSTALLED_APPS; - модули загружаются при старте Django-процесса;
- логика регистрации сигналов, моделей и задач часто завязана на факт импорта модуля.
Интеграция QTasks с Django опирается на эти особенности и не требует изменения стандартного жизненного цикла Django-приложения.
Автоматическое обнаружение задач¶
Для интеграции с Django в QTasks предусмотрен механизм автоматического импорта модулей задач.
from qtasks.contrib.django import autodiscover_tasks
autodiscover_tasks(qtasks_app, ["tasks1", "tasks2"])
Этот механизм предназначен для того, чтобы QTasks мог обнаружить и зарегистрировать задачи, объявленные внутри Django-приложений, без явного импорта каждого модуля вручную.
Принцип работы autodiscover_tasks¶
Функция autodiscover_tasks использует архитектурный принцип Django: все приложения,
указанные в INSTALLED_APPS, уже известны системе.
На высоком уровне процесс выглядит следующим образом:
- Получается список Django-приложений из
INSTALLED_APPS. - Для каждого приложения выполняется попытка импорта указанных модулей.
- При успешном импорте происходит выполнение кода модуля.
- Задачи, объявленные в этих модулях, автоматически регистрируются в переданном
экземпляре
QueueTasks.
Ключевой момент: QTasks не вмешивается в процесс регистрации задач. Он лишь гарантирует, что модули будут импортированы.
Контракт функции autodiscover_tasks¶
Сигнатура функции выглядит следующим образом:
def autodiscover_tasks(app, modules: Optional[list[str]] = None):
"""Автоматически импортирует указанные модули из всех INSTALLED_APPS,
чтобы зарегистрировать задачи в QTasks.
Args:
app (QueueTasks): приложение.
modules (List[str]): модули для автодискавери.
По умолчанию: ["tasks"].
"""
С архитектурной точки зрения важно следующее:
appпередаётся явно — интеграция не полагается на глобальное состояние;- список модулей конфигурируем и не зашит жёстко;
- функция не возвращает данные и не влияет на жизненный цикл приложения.
Регистрация задач¶
Регистрация задач происходит стандартным для QTasks способом:
- при выполнении декоратора
@app.task; - при использовании роутеров, подключённых к
app.
autodiscover_tasks лишь гарантирует, что код с объявлениями будет выполнен в
корректный момент времени.
Таким образом:
- Django управляет загрузкой приложений;
- QTasks управляет регистрацией задач;
- точкой соприкосновения является механизм импорта модулей.
Архитектурные преимущества подхода¶
Такой способ интеграции даёт несколько важных преимуществ:
- отсутствие жёсткой зависимости QTasks от Django;
- сохранение стандартной структуры Django-проектов;
- отсутствие глобальных побочных эффектов;
- возможность использования нескольких экземпляров QTasks.
Интеграция остаётся тонким слоем между системами, а не попыткой объединить их жизненные циклы.
Границы ответственности¶
- Django отвечает за обнаружение и загрузку приложений;
autodiscover_tasksотвечает за импорт модулей задач;- QTasks отвечает за регистрацию и выполнение задач.
Соблюдение этих границ позволяет использовать QTasks в Django-проектах без нарушения архитектуры обеих систем.