Импорт пакетов из внешнего проекта 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