Following system colour scheme - Python 增強提案 Selected dark colour scheme - Python 增強提案 Selected light colour scheme - Python 增強提案

Python 增強提案 (Python Enhancement Proposals)

PEP 503 – 簡易儲存庫 API

作者:
Donald Stufft <donald at stufft.io>
BDFL-Delegate:
Donald Stufft <donald at stufft.io>
討論於:
Distutils-SIG 郵件列表
狀態:
最終 (Final)
類型:
標準軌跡 (Standards Track)
主題:
套件封裝 (Packaging)
建立日期:
2015年9月4日
公告歷史:
2015年9月4日
決議:
Distutils-SIG 訊息

目錄

重要資訊

本 PEP 是一份歷史文件。最新的標準規範《簡單套件庫 API (Simple repository API)》維護於 PyPA 規範頁面

×

關於如何提出變更,請參閱 PyPA 規範更新流程

摘要

Python 套件儲存庫(repository)有許多實作方式,也有許多工具會消耗這些儲存庫。其中,定義「簡易(simple)」儲存庫 API 外觀的標準實作,正是驅動 PyPI 的實作。本文件將規範該 API,記錄任何簡易儲存庫 API 實作應具備的正確行為。

規範

實作簡易 API 的儲存庫由其「基礎 URL(base URL)」定義,這是所有其他 URL 所在的頂層 URL。此 API 之所以稱為「簡易」儲存庫,是因為 PyPI 的基礎 URL 為 https://pypi.org/simple/

附註

本文件後續提及的所有 URL 皆為相對於此基礎 URL(因此,以 PyPI 的 URL 為例,/foo/ 的 URL 即為 https://pypi.org/simple/foo/)。

在儲存庫內,根 URL(本 PEP 中代表基礎 URL 的 /必須是一個有效的 HTML5 頁面,且針對儲存庫中的每個專案提供一個錨點(anchor)元素。錨點標籤的文字必須為專案名稱,且 href 屬性必須連結至該特定專案的 URL。範例如下:

<!DOCTYPE html>
<html>
  <body>
    <a href="/frob/">frob</a>
    <a href="/spamspamspam/">spamspamspam</a>
  </body>
</html>

在根 URL 之下,儲存庫內包含的每個個別專案都有另一個 URL。此 URL 的格式為 /<project>/,其中 <project> 應替換為該專案的「正規化名稱(normalized name)」。例如,名為“HolyGrail”的專案其 URL 將會是 /holygrail/。此 URL 必須回傳一個有效的 HTML5 頁面,並針對該專案的每個檔案提供一個錨點元素。href 屬性必須為連結至檔案下載位置的 URL,且錨點標籤的文字必須符合 URL 的最終路徑組件(即檔名)。URL 包含一個以 URL 片段形式存在的雜湊值,語法如下:#<hashname>=<hashvalue>,其中 <hashname> 為雜湊函數的小寫名稱(如 sha256),而 <hashvalue> 則為十六進位編碼的摘要。

除上述內容外,該 API 還受以下規範限制:

  • 所有回傳 HTML5 頁面的 URL 必須/ 結尾,且儲存庫將未以 / 結尾的 URL 重新導向至結尾包含 / 的路徑。
  • URL 可以是絕對路徑或相對路徑,只要它們指向正確的位置即可。
  • 關於檔案相對於儲存庫應託管在何處,並無任何限制。
  • 只要 API 頁面上存在必要的錨點元素,頁面中可包含任何其他 HTML 元素。
  • 儲存庫可以將未正規化的 URL 重新導向至標準的正規化 URL(例如 /Foobar/ 可能會重新導向至 /foobar/),然而客戶端不得依賴此重新導向行為,且必須直接請求正規化後的 URL。
  • 儲存庫從 Python 標準函式庫 hashlib 模組保證可用的雜湊函數中選擇一種(目前為 md5, sha1, sha224, sha256, sha384, sha512)。目前的建議是使用 sha256
  • 如果特定發行版檔案有 GPG 簽章,該簽章必須與檔案放置在一起,並在檔名後加上 .asc。例如,若存在檔案 /packages/HolyGrail-1.0.tar.gz 且有相關聯的簽章,則該簽章應位於 /packages/HolyGrail-1.0.tar.gz.asc
  • 儲存庫可以在檔案連結中包含 data-gpg-sig 屬性,並將值設為 truefalse,以指示是否有 GPG 簽章。若儲存庫採取此做法,則在每個連結上都包含此屬性。
  • 儲存庫可以在檔案連結中包含 data-requires-python 屬性。此屬性會公開 PEP 345 中指定的 Requires-Python 中繼資料欄位。若此屬性存在,安裝工具在安裝至不符合該需求的 Python 版本時,忽略此下載項目。範例如下:
    <a href="..." data-requires-python="&gt;=3">...</a>
    

    在屬性值中,< 和 > 必須分別以 HTML 編碼表示為 &lt;&gt;

正規化名稱

本 PEP 引用了「正規化」專案名稱的概念。根據 PEP 426,名稱中僅允許使用 ASCII 字母、ASCII 數字、.- 以及 _。名稱應轉換為小寫,並將所有連續的 .-_ 字元替換為單一 - 字元。這可以使用 Python 的 re 模組來實作:

import re

def normalize(name):
    return re.sub(r"[-_.]+", "-", name).lower()

變更

  • 選用的 data-requires-python 屬性於 2016 年 7 月加入。

來源:https://github.com/python/peps/blob/main/peps/pep-0503.rst

最後修改:2025-08-20 21:30:45 GMT