Django: перевод DRY и повторного использования кода на следующий уровень? - PullRequest
0 голосов
/ 19 мая 2019

В культуре django я столкнулся с концепцией повторного использования приложения, но не повторного использования фрагмента.Вот пример того, что я подразумеваю под повторным использованием фрагмента: у меня есть функция getDateTimeObjFromString (sDateTime), очевидно, вы передаете строковую дату-время, и она возвращает объект даты-времени Python.

Назад в конце 1980-х илиВ начале 1990-х годов я познакомился с идеей повторного использования фрагментов на конференции разработчиков FoxPro.Если вы пишете код для конкретной проблемы и находите его полезным в другом месте вашего проекта, переместите его в библиотеку проекта.Если вы обнаружите, что код полезен для других проектов, переместите его в общую библиотеку, к которой могут обращаться все проекты.

(В FoxPro DevCon они не называли его повторным использованием фрагмента. Я придумал этот термин дляпоясните, что я имею в виду повторное использование кусков кода, меньшего, чем целое приложение. FoxPro DevCon был давно, я точно не помню, как они его называли.)

Я прочитал самую последнюю версию «Два шага»Django ", и в нем упоминается повторное использование фрагментов в одном проекте, но я не нашел упоминаний о концепции повторного использования фрагментов в нескольких проектах.

Я писал и использовал getDateTimeObjFromString () задолго до того, как занялся своим djangoприложение.Он находится в пакетах, которые я храню в / home / Common / pyPacks.На моих компьютерах я установил PYTHONPATH = / home / Common / pyPacks, чтобы каждый проект мог получить доступ к коду там.Код для getDateTimeObjFromString () находится в подкаталоге Time в файле с именем Convert.py.Итак, чтобы использовать код в любом проекте:

from Time.Convert import getDateTimeObjFromString

Мое приложение django загружает данные из API, и эти данные включают метки времени.Было бы хорошо, если бы API отправлял объекты даты и времени Python, но вы получаете строки.Следовательно, утилита getDateTimeObjFromString ().

Это всего лишь один пример, есть много маленьких функций в / home / Common / pyPacks, которые я нашел удобными для доступа в моем проекте django.

Да/ home / Common / pyPacks находится под контролем версий в github, и да, я развертываю на любом конкретном компьютере с помощью git pull.

При работе над моим проектом django с компьютера разработчика, PYTHONPATH работает, и я могу импортировать пакеты,Но затем я попытался запустить приложение django на сервере через wsgi.py - PYTHONPATH отключен.Я могу установить PYTHONPATH как на уровне ОС, так и на уровне Apache2, но python игнорирует его, функции не могут импортироваться.

Я не хочу беспокоиться о том, чтобы сделать мою личную универсальную библиотеку официальным пакетом python под PyPI.

Ожидает ли сообщество django, что я копирую и вставляю?

Я пришел к решению: сделать / home / Common / pyPacks пакет psudeo site, поместив символическую ссылку "pyPks" вкаталог site-packages виртуальной среды в / home / Common / pyPacks, добавление «pyPks» в INSTALLED_APPS, а затем изменение всех операторов импорта следующим образом:

original: 
    from Time.Convert import getDateTimeObjFromString
work around update:
    from pyPks.Time.Convert import getDateTimeObjFromString

Мне также пришлось обновить всю мою универсальную библиотекуфайлы для обработки как абсолютного импорта через PYTHONPATH, так и относительного импорта.

Как исправить «Попытка относительного импорта в неупакованном виде» даже с init .py

Есть ли лучший способ повторно использовать фрагменты в проекте django?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...