Django: лучшая практика для разделения проекта на приложения
Я действительно борюсь со всей этой идеей приложения. Я читал много руководств и руководств по стилю, и я знаю, что я должен попытаться создать специализированные приложения, которые делают ровно одну вещь. Все это имеет смысл, когда вы смотрите на какой-то простой учебный проект, но как только он попадает в сложный проект реальной жизни, я не могу определить, как я должен рисовать линии между различными приложениями.
Одна из проблем заключается в том, что я хочу иметь один сайт (или несколько сайтов), где пользователь видит много разных вещей. Материал, который должен быть из разных приложений, при соблюдении правил дизайна приложения. Как бы я понял что-то подобное? Моя первая идея состояла в том, чтобы создать одно приложение под названием ui
, которое просто обрабатывает ВСЕ виды, которые фактически приводят к шаблону, а все остальные приложения предоставляют модели и вспомогательные функции. Но я боюсь, что приложение ui
станет большим.
Чтобы дать вам небольшой пример: Позволяет ли я иметь сайт, на котором пользователь может выполнять следующие задачи:
- Выберите тему
- установить некоторые параметры для выбранного объекта
- Загрузка файлов, связанных с его учетной записью
- назначить некоторые загруженные файлы теме
- записать некоторый звук, который будет связан с объектом
Прямо сейчас, я бы создал три приложения:
- темы (содержит модель предмета и некоторые связанные модели)
- ресурсы (содержит модель ресурсов, загружает файлы)
- audio (обрабатывает всю запись и обработку звука)
Но тогда мне понадобится какое-то приложение main
или ui
, чтобы обрабатывать взаимодействие этих приложений и создавать фактический сайт, где все приложения каким-то образом задействованы.
Итак, есть ли "правильный" способ сделать это? Или есть какие-то шаблоны, которые я могу использовать? Я также благодарен за ссылки на хорошие ресурсы по этой теме, хотя я уже прочитал немало.
Ответы
Ответ 1
Вам просто нужно убедиться, что ваша структура имеет смысл для вас.
Нет необходимости создавать новое приложение для каждой функции, связанной с другой частью логики проекта.
Многоразовые приложения - это совсем другая история, их код в какой-то мере не должен знать о реализации.
Взгляните на структуру Django для вдохновения
Возможный макет для вашего примера:
project_root/
project/
__init__.py
settings.py
urls.py
templates/
app1/ # override stuff
static/
media/
app1/
__init__.py
admin/ # as a package
__init__.py
subjects.py
resources.py
# etc
models/ # as a package
subjects.py
resources.py
# etc
managers/
__init__.py
subjects.py
resources.py
# etc
services/
__init__.py
audio.py # upload handler etc
views/
__init__.py
subjects.py
urls/
__init__.py
subjects.py
templates/
app1/
subject_list.html # override at project level
static/
app1/
css/
subject.css # override at project level
app2/
__init__.py
models.py # holds a Member model or whatever you require
manage.py
Ответ 2
Я думаю, что лучший способ разграничения приложения примерно эквивалентен тому, как вы ограничиваете класс на объектно-ориентированном языке программирования. Вместо переменных и методов вы думаете о моделях и представлениях соответственно:
модели - это состояние объекта, представления используются для просмотра и взаимодействия с состоянием объекта.
Мое эмпирическое правило: создает ли приложение инкапсулировать определенный набор моделей? Если это так, то я пытаюсь его создать.