Архитектура универсального проекта 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 вот так:

1575d0b28968065994656822d8cf47f4.png

И добавим приложение в 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/, но об этом подробнее в другой статье.

© Habrahabr.ru