進階教學:如何撰寫可重複使用的應用程式

這個進階教學從教學 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.barfrom foo import bar 匯入套件。若要使目錄 (如 polls) 形成一個套件,它必須包含一個特殊的檔案 __init__.py,即使這個檔案是空的。

Django 應用程式是一個 Python 套件,專門用於 Django 專案中。應用程式可能會使用常見的 Django 慣例,例如具有 modelstestsurlsviews 子模組。

稍後我們將使用術語封裝來描述使 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 本身的封裝方式非常類似。對於像投票這樣的小型應用程式來說,這個過程並不太困難。

  1. 首先,在您的 Django 專案之外,為套件建立一個父目錄。將此目錄命名為 django-polls

    為您的應用程式選擇名稱

    在為您的套件選擇名稱時,請查看 PyPI 以避免與現有套件發生命名衝突。我們建議對套件名稱使用 django- 前綴,以識別您的套件是 Django 特有的,並對您的模組名稱使用對應的 django_ 前綴。例如,django-ratelimit 套件包含 django_ratelimit 模組。

    應用程式標籤(也就是應用程式套件的虛線路徑的最後一部分)在INSTALLED_APPS必須是唯一的。避免使用與任何 Django contrib 套件相同的標籤,例如 authadminmessages

  2. polls 目錄移至 django-polls 目錄中,並將其重新命名為 django_polls

  3. 編輯 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"
    
  4. 建立一個檔案 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.
    
  5. 建立一個 django-polls/LICENSE 檔案。選擇授權不在本教學的範圍內,但足以說明,在沒有授權的情況下公開發布的程式碼是無用的。Django 和許多 Django 相容應用程式都是在 BSD 授權下發布的;但是,您可以自由選擇自己的授權。請注意,您的授權選擇將會影響誰可以使用您的程式碼。

  6. 接下來,我們將建立 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/"
    
  7. 許多常見的檔案和 Python 模組和套件預設包含在套件中。若要包含其他檔案,我們需要建立一個 MANIFEST.in 檔案。若要包含範本和靜態檔案,請建立一個檔案 django-polls/MANIFEST.in,內容如下

    django-polls/MANIFEST.in
    recursive-include django_polls/static *
    recursive-include django_polls/templates *
    
  8. 包含詳細的文件是可選的,但建議使用。建立一個空目錄 django-polls/docs 以供未來的文件使用。

    請注意,除非您向其中新增一些檔案,否則 docs 目錄將不會包含在您的套件中。許多 Django 應用程式也會透過 readthedocs.org 等網站線上提供其文件。

  9. 檢查是否已安裝 build 套件 (python -m pip install build) 並嘗試在 django-polls 中執行 python -m build 來建置您的套件。這會建立一個名為 dist 的目錄,並以來源和二進位格式建置您的新套件,django-polls-0.1.tar.gzdjango_polls-0.1-py3-none-any.whl

如需有關封裝的詳細資訊,請參閱 Python 的專案封裝和發佈教學

使用您自己的套件

由於我們已將 polls 目錄移出專案,因此它不再運作。我們現在將透過安裝新的 django-polls 套件來修正此問題。

以使用者程式庫身分安裝

以下步驟將 django-polls 作為使用者函式庫安裝。相較於將套件安裝在整個系統中,以使用者為單位安裝有很多優點,例如可以在沒有管理員權限的系統上使用,並防止套件影響系統服務和機器上的其他使用者。

請注意,以使用者為單位安裝仍然會影響以該使用者身分執行的系統工具的行為,因此使用虛擬環境是更穩健的解決方案(請參閱下文)。

  1. 若要安裝套件,請使用 pip(您已經安裝它了,對吧?)。

    python -m pip install --user django-polls/dist/django-polls-0.1.tar.gz
    
  2. 更新 mysite/settings.py 以指向新的模組名稱。

    INSTALLED_APPS = [
        "django_polls.apps.PollsConfig",
        ...,
    ]
    
  3. 更新 mysite/urls.py 以指向新的模組名稱。

    urlpatterns = [
        path("polls/", include("django_polls.urls")),
        ...,
    ]
    
  4. 執行開發伺服器以確認專案可以繼續運作。

發佈您的應用程式

現在我們已經封裝並測試了 django-polls,它已經準備好與全世界分享了!如果這不僅僅是一個範例,您現在可以

使用虛擬環境安裝 Python 套件

稍早,我們將 django-polls 作為使用者函式庫安裝。這樣做有一些缺點:

  • 修改使用者函式庫可能會影響系統上的其他 Python 軟體。

  • 您將無法執行此套件(或其他具有相同名稱的套件)的多個版本。

通常,這些情況只有在您維護多個 Django 專案時才會出現。當它們發生時,最佳解決方案是使用 venv。此工具可讓您維護多個隔離的 Python 環境,每個環境都有自己的函式庫和套件命名空間副本。

回到頂端