Процесс установки модуля: подробное описание
Обновлено: 07 Декабрь 2025
Версия: 2.2
При установке модуля в системе происходит следующий процесс:
1. Загрузка и валидация ZIP архива
- Загрузка ZIP файла - модуль загружается через админ-панель или API
- Распаковка во временную директорию - ZIP архив распаковывается во временную папку (
/tmp/...) - Валидация
**module.json**: - Проверка наличия обязательных полей (
name,code,version,settings) - Проверка структуры конфигурации
- Проверка версии системы (если указана
min_system_version) - Проверка зависимостей от других модулей
- Валидация структуры меню (до 3 уровней вложенности)
- Валидация структуры URL
2. Копирование файлов модуля и обновление apps.py
Путь установки:
{BASE_DIR}/modules/installed/{app_name}/
Где:
BASE_DIR- корневая директория проекта Djangoapp_name- имя Django приложения изmodule.json->settings.app_name
Процесс копирования:
- Создается директория
modules/installed/(если не существует) - Если в ZIP архиве есть папка с именем модуля, используется она, иначе - корень архива
- Если модуль уже установлен, старая версия удаляется
- Все файлы модуля копируются в целевую директорию:
models.py,views.py,urls.py,admin.pymigrations/- папка с миграциямиtemplates/- шаблоныstatic/- статические файлыapps.py- конфигурация приложения- Все остальные файлы модуля
Автоматическое обновление apps.py: После копирования файлов система автоматически обновляет файл apps.py модуля:
- Поле
nameв классеAppConfigобновляется на полный путь:modules.installed.{app_name} - Это необходимо для корректной работы Django, так как приложение добавляется в
INSTALLED_APPSс полным путем - Например, если
app_name = 'task_reminder_module', тоnameбудет изменено на'modules.installed.task_reminder_module' - Важно: Поле
labelостается без изменений и должно быть указано в исходном файле
Пример обновления apps.py:
# До установки:
class TaskReminderConfig(AppConfig):
name = 'task_reminder_module'
label = 'task_reminder_module' # Остается без изменений
# После установки (автоматически):
class TaskReminderConfig(AppConfig):
name = 'modules.installed.task_reminder_module' # Обновляется автоматически
label = 'task_reminder_module' # Остается без изменений
Пример структуры после установки:
/home/kvasnikov/askdev/ask/
├── modules/
│ └── installed/
│ └── example_module/
│ ├── __init__.py
│ ├── models.py
│ ├── views.py
│ ├── urls.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations/
│ │ └── 0001_initial.py
│ ├── templates/
│ │ └── example_module/
│ └── static/
│ └── example_module/
3. Добавление в INSTALLED_APPS
Автоматическое добавление:
- Модули автоматически добавляются в
INSTALLED_APPSпри старте приложения - Это происходит через
modules/apps.py->ModulesConfig.ready() - Метод загружает все установленные и активные модули из базы данных
- Каждый модуль добавляется как
modules.installed.{app_name}
Процесс:
- При старте Django загружается
ModulesConfig - Вызывается метод
ready() - Загружаются все записи
ModuleInstallationсо статусом'installed'иis_active=True - Каждое приложение добавляется в
settings.INSTALLED_APPS - Django автоматически загружает приложения из
INSTALLED_APPS
Перезапуск приложения:
- После установки модуля требуется перезапуск сервера для применения изменений
- При следующем запуске модуль будет автоматически загружен
4. Добавление в INSTALLED_APPS и перезагрузка конфигурации
Процесс:
- Приложение добавляется в
settings.INSTALLED_APPSс полным путем:modules.installed.{app_name} - Конфигурация приложений Django перезагружается через
apps.app_configs.clear()иapps.set_installed_apps() - Это необходимо, чтобы Django узнал о новом приложении перед выполнением миграций
Важно: Перезагрузка конфигурации приложений происходит автоматически во время установки модуля.
5. Выполнение миграций базы данных
Автоматическое выполнение:
python manage.py makemigrations {app_label}
python manage.py migrate {app_label}
Процесс:
- Если в
module.json->settings.migrations=true(по умолчанию), выполняются миграции - Сначала выполняется
makemigrationsдля создания новых миграций (если они есть) - Затем выполняется
migrateс использованием метки приложения (app_label) - Метка приложения соответствует
app_nameизmodule.json->settings.app_name - Все миграции из папки
migrations/применяются к базе данных - Создаются необходимые таблицы, индексы и связи
В случае ошибки:
- Если миграции не удались, модуль не устанавливается
- Файлы модуля остаются на диске, но запись об установке не создается
- Необходимо исправить ошибки в миграциях и повторить установку
6. Регистрация URL маршрутов
Автоматическая регистрация:
- URL автоматически регистрируются при старте приложения
- Это происходит через
modules/url_loader.py->get_module_urlpatterns() - Функция вызывается в
config/urls.pyи добавляет URL всех установленных модулей
Процесс:
- При загрузке
config/urls.pyвызываетсяget_module_urlpatterns() - Загружаются все установленные и активные модули из базы данных
- Для каждого модуля читается конфигурация URL из
config_data.urls - URL добавляются в основной
urlpatternsчерезpath()иinclude() - Поддерживаются как относительные, так и абсолютные пути импорта
- Поддерживаются namespace для URL
7. Регистрация шаблонов
Автоматическая регистрация:
- Пути к шаблонам модулей автоматически добавляются в
TEMPLATES['DIRS']при старте приложения - Это происходит через
modules/apps.py->ModulesConfig.ready() - Система находит все установленные модули и добавляет путь
modules/installed/{app_name}/templates/в список директорий шаблонов
Процесс:
- При старте Django загружается
ModulesConfig - Вызывается метод
ready() - Для каждого установленного модуля проверяется наличие папки
templates/ - Если папка существует, её путь добавляется в
TEMPLATES['DIRS'] - Django автоматически находит шаблоны в этих директориях
Важно: Шаблоны должны находиться в папке с именем модуля: templates/{module_name}/template.html
Формат конфигурации URL:
{
"urls": [
{
"path": "example/",
"include": "example_module.urls",
"namespace": "example"
}
]
}
Перезапуск приложения:
- После установки модуля требуется перезапуск сервера для применения изменений
- При следующем запуске URL будут автоматически зарегистрированы
7. Регистрация меню
Регистрация в реестре:
- Конфигурация меню из
module.json->menuсохраняется вModuleRegistry - Меню отображается динамически через template tag
{% module_menu_items %}
Отображение:
- Меню отображается в боковой панели через
modules/templatetags/module_tags.py - Проверяются права доступа для каждого пункта меню
- Поддерживается до 3 уровней вложенности
Перезагрузка не требуется - меню отображается динамически при каждом запросе
8. Загрузка шаблонов уведомлений
Автоматическая загрузка:
- Шаблоны уведомлений из
module.json->notification_templatesзагружаются в базу данных - Email шаблоны создаются в модели
EmailTemplate - Messenger шаблоны создаются в модели
MessengerTemplate
Процесс:
- При установке модуля читается секция
notification_templatesиз конфигурации - Для каждого шаблона формируется уникальное имя:
{module_code}_{template_name} - Шаблоны создаются или обновляются в базе данных
- Шаблоны помечаются как системные (
system=True) - Раздел (
section) устанавливается в название модуля, если не указан явно
Использование:
- После установки шаблоны доступны для использования через
send_notify() - Используйте полное имя шаблона:
{module_code}_{template_name} - Шаблоны отображаются в разделе настроек уведомлений (
/settings/notify/)
При обновлении модуля:
- Существующие шаблоны обновляются новыми значениями
- Имя шаблона остается прежним (для совместимости)
При удалении модуля:
- Все шаблоны модуля удаляются из базы данных
9. Создание записи в базе данных
Создается запись **ModuleInstallation**:
module- ссылка на модульinstalled_version- установленная версияstatus='installed'is_active=Trueapp_name- имя Django приложенияinstall_path- путь к установленным файламconfig_data- полная конфигурация изmodule.jsoninstalled_by- пользователь, установивший модульinstalled_at- дата и время установки
Обновляется запись **Module**:
is_installed=True
10. Очистка временных файлов
- Временная директория с распакованным ZIP архивом удаляется
- Остаются только файлы в
modules/installed/{app_name}/