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


ссылка на оригинал статьи https://habr.com/ru/post/692518/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *