Архитектура универсального проекта Django
Введение
В ходе последних лет моей разработки проектов Django я понял, что почти все они имеют одно строение.
Перейти на схему (п.8), кому нужна только схема без объяснений.
1. Poetry — создание общей директории
$ poetry new maindir
$ tree maindir
maindir/
├── maindir
│ └── init.py
├── pyproject.toml
├── README.rst
└── tests
├── init.py
└── test_maindir.py
«Maindir» в данном случае названа так, чтобы показать, что это исходная директория. В реальной жизни у вас будет название проекта.
2. Установка зависимости Django
$ poetry shell
$ poetry add django
3. Создание проекта Django
3.1 Переименовываем внутреннюю директорию maindir to src
$ cd maindir
~/maindir
$ mv maindir src
$ cd src
3.2 Создаем проект Django внутри папки src
~/maindir/src
$ django-admin startproject config .
3.3 Удаляем tests/ и README.rst
получаем:
$tree maindir
maindir/
├── poetry.lock
├── pyproject.toml
└── src
├── config
│ ├── asgi.py
│ ├── init.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── init.py
└── manage.py
4. Инициализация Git
$ git init
$ touch .gitignore
$ touch README.md
5. Промежуточный итог
maindir/
├── .git
│ ├── ...
├── .gitignore
├── poetry.lock
├── pyproject.toml
├── README.md
└── src
├── config
│ ├── asgi.py
│ ├── init.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── init.py
└── manage.py
Проект Django находится в директории src.
Остальные файлы и приложения на одном уровне с src/, то есть внутри главной директории всего проекта maindir): например, .gitignore, Dockerfile, deploy/, setup.cfg, poetry.lock и т.д.
6. Открытие проекта в PyCharm
Если вы не используете PyCharm, можете пропустить этот этап, продолжая работать, например, из командной строки без потери функциональности.
6.1 Открываем в PyCharm директорию maindir
6.2 Выбираем виртуальное окружение.
6.2.1 Для этого заходим File/Settings/Project: maindir/Python Interpreter
6.2.2 Жмем «add interpreter», далее «add local interpreter», выбираем Poetry Environment, далее Existing Environment и находим наше окружение по имени или пути, созданное в 1–2 пунктах.
6.3 Указываем PyCharm где нужно применять Django (File/Settings/Languages & Frameworks)
6.4 Помечаем директорию src/ как ресурсную, для этого правой кнопкой мыши кликаем по src, наводим в появившемся окне «Mark Directory as» и выбираем Sources Root.
7. Создание директорий проекта Django
7.1 APPS/
~/maindir/src
$ mkdir apps
$ touch apps/__init__.py
Или в PyCharm кликаете по src, выбираете New, далее Python Package.
Далее по тексту будем пользоваться именно этим способом.
Абсолютно все приложения django создаются внутри директории apps/.
Чтобы django адекватно подхватывал приложения из apps/, необходимо будет сделать небольшую настройку после создания каждого приложения.
Давайте создадим для примера приложение payment внутри apps/ и настроим:
~/maindir/src
$ mkdir apps/payment
$ ./manage.py startapp payment apps/payment
$ tree
├── apps
│ ├── __init__.py
│ └── payment
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── config
...
Отредактируем файл apps/payment/apps.py вот так:
И добавим приложение в config/settings.py
...
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'apps.payment.apps.PaymentConfig'
]
...
7.2 API/
Все views.py собираются в этой директории.
Поэтому смело удаляем apps/payment/views.py
Также внутри api/ создаем две директории auth/ и v1/
auth/ — в любом случае, я всегда всегда делаю свою аутентификацию (например, по токену), а также всякие permissions для эндпоинтов API и т.д.
v1/ — версия API, здесь собираются директории (python package, тождественные названию приложений в apps), в которых уже находятся views.py
7.3 UTILS/
Вспомогательный код.
В эту директорию запрещается любой импорт из api/ иapps/, и других директорий проекта.
7.4 LIBRARY/
Код для работы с другими API, системами и т.д.
В эту директорию запрещается любой импорт из api/ иapps/, и других директорий проекта, кроме utils/.
7.5 WORKERS/
Задания для Celery
8 Итого: минимальная архитектура проекта Django
├── api
│ ├── __init__.py
│ └── auth
│ │ ├── auth.py
│ │ └── permissions.py
│ └── v1
│ ├── payment
│ │ ├── __init__.py
│ │ └── views.py
│ ├── __init__.py
│ └── urls.py
├── apps
│ ├── __init__.py
│ └── payment
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── config
│ ├── asgi.py
│ ├── __init__.py
│ ├── __pycache__
│ │ ├──...
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── library
│ ├── youtube
│ │ ├── __init__.py
│ │ ├── videos.py
│ │ └── ...
│ ├── __init__.py
│ └── ...
├── utils
│ ├── __init__.py
│ ├── numbers.py
│ └── ...
├── workers
│ ├── payment
│ │ ├── __init__.py
│ │ └── tasks.py
│ ├── __init__.py
│ └── ...
├── __init__.py
└── manage.py
P.S.
На самом деле я еще разбиваю config/, а также каждое приложение в директории apps/, но об этом подробнее в другой статье.