Перейти к содержанию

Интеграция с 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, уже известны системе.

На высоком уровне процесс выглядит следующим образом:

  1. Получается список Django-приложений из INSTALLED_APPS.
  2. Для каждого приложения выполняется попытка импорта указанных модулей.
  3. При успешном импорте происходит выполнение кода модуля.
  4. Задачи, объявленные в этих модулях, автоматически регистрируются в переданном экземпляре 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-проектах без нарушения архитектуры обеих систем.