Продвинутый учебник: как писать повторно используемые приложения
Этот продвинутый учебник продолжает тему, на которой остановился Учебник 8. Мы превратим наше веб-приложение для опросов в автономный пакет Python, который можно повторно использовать в новых проектах и распространять среди других.
Если вы недавно не проходили учебники 1–8, рекомендуем вернуться к ним, чтобы ваш пример проекта соответствовал описанному ниже.
Повторное использование — это важно
Проектирование, создание, тестирование и поддержка веб-приложения требуют немало усилий. Во многих проектах на Python и Django возникают общие проблемы. Разве не было бы здорово, если бы нам удалось сократить эту повторяющуюся работу?
Повторное использование — неотъемлемая часть работы с Python. Индекс пакетов Python (PyPI) предлагает огромное количество пакетов, которые можно использовать в собственных программах на Python. Ознакомьтесь с Django Packages, чтобы найти готовые приложения для повторного использования, которые можно включить в свой проект. Сам Django тоже является обычным пакетом Python. Это значит, что вы можете брать существующие пакеты Python или приложения Django и объединять их в собственный веб-проект. Вам останется написать только те части, которые делают ваш проект уникальным.
Представим, что вы начинаете новый проект, которому нужно приложение для опросов, подобное тому, над которым мы работали. Как сделать это приложение повторно используемым? К счастью, вы уже на верном пути. В Учебнике 1 мы увидели, как можно отделить приложение polls от URLconf уровня проекта с помощью include. В этом учебнике мы сделаем следующие шаги, чтобы приложение было легко использовать в новых проектах и подготовить его к публикации, чтобы другие могли установить и использовать его.
Пакет? Приложение?
Пакет Python package позволяет группировать связанный код Python для удобного повторного использования. Пакет содержит один или несколько файлов с кодом Python (также называемых «модулями»).
Пакет можно импортировать с помощью import foo.bar или from foo import
bar. Чтобы каталог (например, polls) считался пакетом, он должен содержать специальный файл __init__.py, даже если этот файл пуст.
Приложение Django — это пакет Python, предназначенный специально для использования в проекте Django. Приложение может использовать общепринятые в Django соглашения, например иметь подмодули models, tests, urls и views.
Далее мы будем использовать термин упаковка для описания процесса подготовки пакета Python к простой установке другими пользователями. Мы знаем, что это может немного сбивать с толку.
Ваш проект и повторно используемое приложение
После предыдущих учебников наш проект должен выглядеть так:
djangotutorial/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
0001_initial.py
models.py
static/
polls/
images/
background.png
style.css
templates/
polls/
detail.html
index.html
results.html
tests.py
urls.py
views.py
templates/
admin/
base_site.html
Вы создали djangotutorial/templates в Учебнике 7, а polls/templates — в Учебнике 3. Теперь, возможно, стало понятнее, почему мы решили использовать отдельные каталоги шаблонов для проекта и приложения: всё, что относится к приложению polls, находится в polls. Благодаря этому приложение является самодостаточным и его проще перенести в новый проект.
Теперь каталог polls можно скопировать в новый проект Django и сразу же использовать повторно. Однако он ещё не совсем готов к публикации. Для этого нужно упаковать приложение, чтобы другим было проще его установить.
Установка необходимых компонентов
В настоящее время инструменты для упаковки Python довольно запутанны и разнообразны. В этом учебнике мы будем использовать setuptools для сборки нашего пакета. Это рекомендуемый инструмент для упаковки (объединённый с ответвлением distribute). Для установки и удаления пакета мы также будем использовать pip. Установите эти два пакета сейчас. Если вам нужна помощь, обратитесь к инструкции как установить Django с помощью pip. setuptools можно установить таким же образом.
Упаковка приложения
Упаковка Python — это подготовка приложения в определённом формате, который позволяет легко установить и использовать его. Сам Django упакован примерно таким же образом. Для небольшого приложения вроде polls этот процесс не слишком сложен.
-
Сначала создайте родительский каталог для пакета за пределами проекта Django. Назовите этот каталог
django-polls.Выбор имени для приложения
Выбирая имя для пакета, проверьте PyPI, чтобы избежать конфликтов с существующими пакетами. Мы рекомендуем использовать префикс
django-в именах пакетов, чтобы обозначить их принадлежность к Django, и соответствующий префиксdjango_для имени модуля. Например, пакетdjango-ratelimitсодержит модульdjango_ratelimit.Метки приложений (то есть последняя часть пути с точками к пакетам приложений) должны быть уникальными в
INSTALLED_APPS. Не используйте те же метки, что и у пакетов contrib Django, напримерauth,adminилиmessages. - Переместите каталог
pollsв каталогdjango-pollsи переименуйте его вdjango_polls. -
Измените
django_polls/apps.pyтак, чтобыnameуказывал на новое имя модуля, и добавьтеlabel, чтобы задать короткое имя приложения:django-polls/django_polls/apps.pyfrom django.apps import AppConfig class PollsConfig(AppConfig): name = "django_polls" label = "polls" -
Создайте файл
django-polls/README.rstсо следующим содержимым:django-polls/README.rst============ django-polls ============ django-polls is a Django app to conduct web-based polls. For each question, visitors can choose between a fixed number of answers. Detailed documentation is in the "docs" directory. Quick start ----------- 1. Add "polls" to your INSTALLED_APPS setting like this:: INSTALLED_APPS = [ ..., "django_polls", ] 2. Include the polls URLconf in your project urls.py like this:: path("polls/", include("django_polls.urls")), 3. Run ``python manage.py migrate`` to create the models. 4. Start the development server and visit the admin to create a poll. 5. Visit the ``/polls/`` URL to participate in the poll. - Создайте файл
django-polls/LICENSE. Выбор лицензии выходит за рамки этого учебника, но достаточно сказать, что код, опубликованный без лицензии, бесполезен. Django и многие совместимые с Django приложения распространяются по лицензии BSD; однако вы можете выбрать любую другую лицензию. Просто имейте в виду, что выбор лицензии влияет на то, кто сможет использовать ваш код. -
Теперь создадим файл
pyproject.toml, в котором описано, как собирать и устанавливать приложение. Полное объяснение этого файла выходит за рамки данного учебника, но в руководстве пользователя по упаковке Python есть хорошее объяснение. Создайте файлdjango-polls/pyproject.tomlсо следующим содержимым:django-polls/pyproject.toml[build-system] requires = ["setuptools>=69.3"] build-backend = "setuptools.build_meta" [project] name = "django-polls" version = "0.1" dependencies = [ "django>=X.Y", # Replace "X.Y" as appropriate ] description = "A Django app to conduct web-based polls." readme = "README.rst" requires-python = ">= 3.12" authors = [ {name = "Your Name", email = "yourname@example.com"}, ] classifiers = [ "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: X.Y", # Replace "X.Y" as appropriate "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", ] [project.urls] Homepage = "https://www.example.com/" -
Многие распространённые файлы, а также модули и пакеты Python включаются в пакет по умолчанию. Чтобы включить дополнительные файлы, нам понадобится создать файл
MANIFEST.in. Чтобы включить шаблоны и статические файлы, создайте файлdjango-polls/MANIFEST.inсо следующим содержимым:django-polls/MANIFEST.inrecursive-include django_polls/static * recursive-include django_polls/templates *
-
Добавлять подробную документацию к приложению необязательно, но рекомендуется. Создайте пустой каталог
django-polls/docsдля будущей документации.Обратите внимание: каталог
docsне будет включён в пакет, пока вы не добавите в него файлы. Многие приложения Django также публикуют документацию в интернете, например на сайтах вроде readthedocs.org.Многие проекты Python, в том числе Django и сам Python, используют Sphinx для сборки документации. Если вы решите использовать Sphinx, то сможете ссылаться на документацию Django, настроив Intersphinx и добавив значение Django в параметр
intersphinx_mappingвашего проекта:intersphinx_mapping = { # ... "django": ( "https://docs.djangoproject.com/en/stable/", None, ), }После этого можно будет создавать перекрёстные ссылки на конкретные элементы, как и в документации Django, например «
:attr:`django.test.TransactionTestCase.databases`». - Убедитесь, что пакет build установлен (
python -m pip install build), и попробуйте собрать пакет, выполнивpython -m buildвнутриdjango-polls. Будет создан каталогdist, а ваш новый пакет будет собран в форматах исходного кода и двоичного файла:django_polls-0.1.tar.gzиdjango_polls-0.1-py3-none-any.whl.
Дополнительную информацию об упаковке можно найти в учебнике по упаковке и распространению проектов на сайте Python.
Использование собственного пакета
После перемещения каталога polls за пределы проекта приложение перестало работать. Теперь мы исправим это, установив наш новый пакет django-polls.
Установка в пользовательскую библиотеку
Следующие шаги устанавливают django-polls в пользовательскую библиотеку. Установка для отдельного пользователя имеет ряд преимуществ по сравнению с установкой пакета для всей системы: например, пакет можно использовать в системах, где у вас нет прав администратора, и он не будет влиять на системные службы и других пользователей компьютера.
Обратите внимание: установка для отдельного пользователя всё ещё может повлиять на работу системных инструментов, запущенных от имени этого пользователя, поэтому использование виртуального окружения — более надёжное решение (см. ниже).
-
Чтобы установить пакет, используйте pip (вы ведь уже установили его, верно?):
python -m pip install --user django-polls/dist/django_polls-0.1.tar.gz
-
Измените
mysite/settings.pyтак, чтобы он указывал на новое имя модуля:INSTALLED_APPS = [ "django_polls.apps.PollsConfig", ..., ] -
Измените
mysite/urls.pyтак, чтобы он указывал на новое имя модуля:urlpatterns = [ path("polls/", include("django_polls.urls")), ..., ] - Запустите сервер разработки, чтобы убедиться, что проект по-прежнему работает.
Публикация приложения
Теперь, когда мы упаковали и протестировали django-polls, им можно поделиться со всем миром! Если бы это был не просто пример, вы могли бы:
- Отправить пакет другу по электронной почте.
- Загрузить пакет на свой сайт.
- Опубликовать пакет в общедоступном репозитории, например в индексе пакетов Python (PyPI). Для этого есть хороший учебник.
Установка пакетов Python в виртуальном окружении
Ранее мы установили django-polls в пользовательскую библиотеку. У такого подхода есть некоторые недостатки:
- Изменение пользовательских библиотек может повлиять на другое программное обеспечение Python в вашей системе.
- Вы не сможете запускать несколько версий этого пакета (или других пакетов с таким же именем).
Обычно с такими ситуациями сталкиваются, только когда поддерживают несколько проектов Django. В этом случае лучше всего использовать venv. Этот инструмент позволяет создавать несколько изолированных окружений Python, каждое со своей копией библиотек и пространством имён пакетов.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/intro/reusable-apps/