進階教學:如何撰寫可重複使用的應用程式¶
這個進階教學從教學 8結束的地方開始。我們將把我們的網路投票變成一個獨立的 Python 套件,您可以在新專案中重複使用,並與其他人分享。
如果您最近沒有完成教學 1-8,我們建議您複習這些教學,以便您的範例專案與下述的範例專案相符。
可重複使用性很重要¶
設計、建置、測試和維護一個 Web 應用程式需要大量的工作。許多 Python 和 Django 專案都有共同的問題。如果我們可以節省一些重複的工作,不是很好嗎?
可重複使用性是 Python 的生活方式。Python 套件索引 (PyPI) 有大量的套件供您在自己的 Python 程式中使用。請查看Django 套件,了解您可以納入專案的現有可重複使用的應用程式。Django 本身也是一個普通的 Python 套件。這表示您可以取得現有的 Python 套件或 Django 應用程式,並將它們組合到您自己的 Web 專案中。您只需要撰寫使您的專案獨特的部分。
假設您要開始一個需要像我們一直在處理的投票應用程式的新專案。您如何使這個應用程式可重複使用?幸運的是,您已經在路上了。在教學 1中,我們看到如何使用 include
將投票與專案層級的 URLconf 解耦。在本教學中,我們將採取進一步的步驟,使該應用程式易於在新專案中使用,並準備好發布供其他人安裝和使用。
套件?應用程式?
Python 套件 提供一種將相關的 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
您在教學 7中建立了 djangotutorial/templates
,並在教學 3中建立了 polls/templates
。現在,或許更清楚為什麼我們選擇為專案和應用程式設定單獨的範本目錄:屬於投票應用程式的所有內容都在 polls
中。它使應用程式獨立,更容易放入新的專案中。
現在,可以將 polls
目錄複製到新的 Django 專案中並立即重複使用。不過,它還沒有完全準備好發布。為此,我們需要封裝應用程式,使其易於他人安裝。
安裝一些先決條件¶
目前 Python 封裝的狀態有點混亂,存在各種工具。在本教學中,我們將使用 setuptools 來建置我們的套件。它是建議的封裝工具(與 distribute
分支合併)。我們也會使用 pip 來安裝和解除安裝它。您現在應該安裝這兩個套件。如果您需要協助,可以參考如何使用 pip 安裝 Django。您可以使用相同的方式安裝 setuptools
。
封裝您的應用程式¶
Python 封裝是指以特定的格式準備您的應用程式,使其易於安裝和使用。Django 本身的封裝方式非常類似。對於像投票這樣的小型應用程式來說,這個過程並不太困難。
首先,在您的 Django 專案之外,為套件建立一個父目錄。將此目錄命名為
django-polls
。為您的應用程式選擇名稱
在為您的套件選擇名稱時,請查看 PyPI 以避免與現有套件發生命名衝突。我們建議對套件名稱使用
django-
前綴,以識別您的套件是 Django 特有的,並對您的模組名稱使用對應的django_
前綴。例如,django-ratelimit
套件包含django_ratelimit
模組。應用程式標籤(也就是應用程式套件的虛線路徑的最後一部分)在
INSTALLED_APPS
中必須是唯一的。避免使用與任何 Django contrib 套件相同的標籤,例如auth
、admin
或messages
。將
polls
目錄移至django-polls
目錄中,並將其重新命名為django_polls
。編輯
django_polls/apps.py
,使name
引用新的模組名稱,並新增label
以提供應用程式的簡短名稱django-polls/django_polls/apps.py
¶from django.apps import AppConfig class PollsConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" 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>=61.0"] 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.10" 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.10", "Programming Language :: Python :: 3.11", "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.in
¶recursive-include django_polls/static * recursive-include django_polls/templates *
包含詳細的文件是可選的,但建議使用。建立一個空目錄
django-polls/docs
以供未來的文件使用。請注意,除非您向其中新增一些檔案,否則
docs
目錄將不會包含在您的套件中。許多 Django 應用程式也會透過 readthedocs.org 等網站線上提供其文件。檢查是否已安裝 build 套件 (
python -m pip install build
) 並嘗試在django-polls
中執行python -m build
來建置您的套件。這會建立一個名為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)。packaging.python.org 有一個很好的教學說明如何執行此操作。
使用虛擬環境安裝 Python 套件¶
稍早,我們將 django-polls
作為使用者函式庫安裝。這樣做有一些缺點:
修改使用者函式庫可能會影響系統上的其他 Python 軟體。
您將無法執行此套件(或其他具有相同名稱的套件)的多個版本。
通常,這些情況只有在您維護多個 Django 專案時才會出現。當它們發生時,最佳解決方案是使用 venv。此工具可讓您維護多個隔離的 Python 環境,每個環境都有自己的函式庫和套件命名空間副本。