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