Импорт пакетов из внешнего проекта django

Контекст: Рассматриваемый пакет - это приложение, разработанное другой командой, и я хочу использовать функциональность, раскрытую как часть вызова API в моем проекте django.

Расположение директории:

<repo>
├── org_wide_django_code
│   ├── my_django_project
│   │   ├── my_django_project
│   │   ├── manage.py
│   │   ├── requirements.txt
│   │   └── my_application
├── frontend
│   └── application
├── other_team_work
│   ├── README.md
│   ├── __init__.py
│   ├── implemented_logic

Каким образом лучше всего использовать other_team_work в моем проекте django my_django_project?

Предварительное чтение:

  • Манипулирование PYTHONPATH или sys.path является вариантом
  • Установка .whl или .egg для установки other_team_work (также необходимо добавить setup.py туда)

Я не уверен, что существует лучший способ, поскольку это во многом зависит от внутреннего инструментария вашей организации. Однако главное, на что следует обратить внимание IMO, это циклы выпуска и разработки. В идеале вы хотите, чтобы обе команды могли выпускать новые возможности, функциональные возможности без влияния на другую команду. (Например, если other_team вносит изменения в свой код для третьей команды, вы бы хотели, чтобы это никак не повлияло на ваше приложение. Аналогично other_team не должен знать, как и когда вы используете их модуль для внесения изменений в их приложение.

Один из способов сделать это - упаковать и установить other_team_work (используя setup.py), а затем поместить в реестр пакетов (например, gitlab's package registery или github packages). Таким образом, вы можете использовать other_team_work как будто это просто другой пакет python с pip (используя аргумент extra-package-url) и использовать определенные версии в requirements.txt.

Самый простой способ (но может быть опасным) - добавить other_team_work к вашему проекту в PYTHONPATH. Вы можете добавить это в файл django settings.py, после определения BASE_DIR. Пример:

import sys

BASE_DIR = Path(__file__).resolve().parent.parent  # default Django base dir
OTHER_TEAM_WORK_PARENT_DIR = BASE_DIR.parent  # in accordance with your directories
sys.path.append(str(OTHER_TEAM_WORK_PARENT_DIR))

Этот код добавит ваш каталог org_wide_django_code в PYTHONPATH и вы сможете импортировать other_team_work в ваш код:

from other_team_work import implemented_logic
Вернуться на верх