PEP 694 – Upload 2.0 API für Python-Paketindizes
- Autor:
- Barry Warsaw <barry at python.org>, Donald Stufft <donald at stufft.io>, Ee Durbin <ee at python.org>
- PEP-Delegate:
- Dustin Ingram <di at python.org>
- Discussions-To:
- Discourse thread
- Status:
- Entwurf
- Typ:
- Standards Track
- Thema:
- Packaging
- Erstellt:
- 11. Juni 2022
- Post-History:
- 27. Juni 2022, 06. Jan 2025 14. Apr 2025 06. Aug 2025 27. Sep 2025
Inhaltsverzeichnis
- Zusammenfassung
- Begründung
- Legacy API
- Upload 2.0 API-Spezifikation
- Versionierung
- Inhaltstypen
- Stammendpunkt
- Authentifizierung für die Upload 2.0 API
- Fehler
- Veröffentlichungssitzung
- Datei-Upload-Sitzung
- Staging-Vorschauen
- Datei-Upload-Mechanismen
- FAQ
- Offene Fragen
- Änderungshistorie
- Urheberrecht
Zusammenfassung
Dieses PEP schlägt eine erweiterbare API für den Upload von Dateien zu einem Python-Paketindex wie PyPI vor. Neben der Standardisierung bietet die Upload-API zusätzliche nützliche Funktionen wie die Unterstützung für
- eine Veröffentlichungssitzung, mit der alle Wheels eines Paket-Releases gleichzeitig veröffentlicht werden können;
- das „Staging“ eines Releases, das zum Testen von Uploads vor der öffentlichen Veröffentlichung verwendet werden kann, ohne dass test.pypi.org benötigt wird;
- Artefakte, die überschrieben und ersetzt werden können, bis eine Sitzung veröffentlicht wird;
- detaillierten Status zu den Uploads von Artefakten;
- die Erstellung neuer Projekte, ohne dass ein Artefakt hochgeladen werden muss;
- ein Protokoll zur Erweiterung der unterstützten Upload-Mechanismen in Zukunft, ohne ein vollständiges PEP zu benötigen; diese können standardisiert und für alle Indizes empfohlen oder Index-spezifisch sein;
Sobald diese neue Upload-API übernommen wurde, kann die bestehende Legacy-API als veraltet markiert werden, jedoch schlägt dieses PEP keinen Zeitplan für die Veralterung der Legacy-API vor.
Begründung
Derzeit gibt es keine standardisierte API für den Upload von Dateien zu einem Python-Paketindex wie PyPI. Stattdessen waren alle gezwungen, die bestehende „Legacy“-API zu Reverse-Engineering.
Die Legacy-API ist zwar funktional, gibt aber Implementierungsdetails der ursprünglichen PyPI-Codebasis preis, die in der neuen Codebasis und alternativen Implementierungen treu nachgebildet wurden.
Darüber hinaus gibt es eine Reihe von Hauptproblemen mit der Legacy-API
- Sie ist vollständig synchron, was dazu zwingt, Anfragen sowohl für den Upload selbst als auch während der Verarbeitung der hochgeladenen Datei durch den Index zur Bestimmung von Erfolg oder Misserfolg offen zu halten.
- Sie unterstützt keine Mechanismen zur Parallelisierung oder Wiederaufnahme eines Uploads. Bei der größten Standard-Dateigröße auf PyPI, die etwa 1 GB beträgt, bedeutet die Anforderung, dass der gesamte Upload erfolgreich abgeschlossen werden muss, eine Verschwendung von Bandbreite, wenn solche Uploads bei einer Netzwerkunterbrechung, während die Anfrage noch läuft, fehlschlagen.
- Die atomare Einheit des Betriebs ist eine einzelne Datei. Dies ist problematisch, wenn ein Release logisch eine sdist und mehrere Binär-Wheels umfasst, was zu Race Conditions führt, bei denen Verbraucher unterschiedliche Versionen des Pakets erhalten, wenn sie Pech haben und ein Paket benötigen, bevor das Wheel ihrer Plattform vollständig hochgeladen wurde. Wenn der Release zuerst seine sdist hochlädt, kann dies auch dazu führen, dass einige Verbraucher nur die sdist sehen, was einen lokalen Build aus dem Quellcode auslöst.
- Die Statusmeldung ist sehr begrenzt. Es gibt keine Unterstützung für die Meldung mehrerer Fehler, Warnungen, Deprecation-Hinweise usw. Der Status ist auf den HTTP-Statuscode und die Statuszeile beschränkt, wobei die Statuszeile seit HTTP/2 (was seit HTTP/2 veraltet ist) (RFC 7540).
- Metadaten für einen Release werden zusammen mit der Datei übermittelt. Da diese Metadaten jedoch bekanntermaßen unzuverlässig sind, wählen die meisten Installer stattdessen, die gesamte Datei herunterzuladen und die Metadaten von dort zu lesen.
- Es gibt keinen Mechanismus, der es einem Index erlaubt, vor dem Hochladen von Bandbreite irgendwelche Plausibilitätsprüfungen durchzuführen. Viele Fälle von ungültigen Metadaten oder falschen Berechtigungen könnten vor dem Hochladen von Dateien überprüft werden.
- Es gibt keine Unterstützung für das „Staging“ eines Releases vor dessen Veröffentlichung im Index.
- Die Erstellung neuer Projekte erfordert das Hochladen mindestens einer Datei, was zu „Stub“-Uploads führt, um einen Projektnamen zu beanspruchen.
Die in diesem PEP vorgeschlagene neue Upload-API bietet Wege, all diese Probleme zu lösen, entweder direkt oder durch einen erweiterbaren Ansatz, der es Servern ermöglicht, Funktionen wie wiederaufnehmbare und parallele Uploads zu implementieren. Diese Upload-API, die dieses PEP vorschlägt, bietet eine bessere Fehlerberichterstattung, eine robustere Erfahrung beim Testen von Releases und die atomare und gleichzeitige Veröffentlichung aller Release-Artefakte.
Legacy API
Das Folgende ist ein Überblick über die Legacy-API. Für eine detaillierte Beschreibung konsultieren Sie die PyPI-Benutzerhandbuchdokumentation.
Endpunkt
Die bestehende Upload-API befindet sich unter einer Basis-URL. Für PyPI ist diese URL derzeit https://upload.pypi.org/legacy/. Clients, die Uploads durchführen, geben die aufzurufende API an, indem sie einen URL-Parameter :action mit dem Wert file_upload hinzufügen. [1]
Die Legacy-API hat auch einen protocol_version Parameter, der theoretisch die Definition neuer API-Versionen ermöglicht. In der Praxis ist dies nie geschehen, und der Wert ist immer 1.
Somit ist die effektive Upload-API auf PyPI: https://upload.pypi.org/legacy/?:action=file_upload&protocol_version=1.
Kodierung
Die zu übermittelnden Daten werden als POST-Anfrage mit dem Content-Type multipart/form-data übermittelt. Dies spiegelt den historischen Charakter der Legacy-API wider, die ursprünglich nicht als API konzipiert war, sondern als Webformular in der ursprünglichen PyPI-Implementierung, wobei Client-Code geschrieben wurde, um dieses Formular programmatisch einzureichen.
Inhalt
Grob gesagt werden die im Paket enthaltenen Metadaten als Teile übermittelt, bei denen die Content-Disposition form-data ist und der Metadaten-Schlüssel der Name des Feldes ist. Die Namen dieser verschiedenen Metadaten sind nicht dokumentiert und stimmen manchmal, aber nicht immer, mit den Namen überein, die in den METADATA-Dateien für Paket-Artefakte verwendet werden. Die Groß-/Kleinschreibung stimmt selten überein, und die Konvertierung von form-data zu METADATA ist inkonsistent.
Die Upload-Artefaktdatei selbst wird als application/octet-stream-Teil mit dem Namen content gesendet, und wenn eine PGP-Signatur angehängt ist, wird sie als application/octet-stream-Teil mit dem Namen gpg_signature enthalten sein.
Authentifizierung
Die Upload-Authentifizierung ist ebenfalls nicht standardisiert.
PyPI verwendet HTTP Basic Authentication mit API-Tokens als Passwort und dem Benutzernamen __token__. Trusted Publishers authentifizieren sich über OpenID Connect und erhalten kurzlebige API-Tokens, die auf dieselbe Weise verwendet werden.
Upload 2.0 API-Spezifikation
Dieses PEP führt den Grund für die meisten Probleme mit der bestehenden API auf grob zwei Dinge zurück:
- Die Metadaten werden zusammen mit der Datei übermittelt, anstatt aus der Datei selbst gelesen zu werden. [2]
- Sie unterstützt nur eine einzige Anfrage, nur mit Formulardaten, die entweder erfolgreich ist oder fehlschlägt, und alle Aktionen sind innerhalb dieser einzelnen Anfrage atomar.
Um diese Probleme zu lösen, schlägt dieses PEP einen Multi-Request-Workflow vor, der auf hoher Ebene diese Schritte umfasst:
- Eine Veröffentlichungssitzung initiieren, wodurch eine Release-Stage erstellt wird.
- Eine oder mehrere Datei-Upload-Sitzungen zu dieser Stage als Teil der Veröffentlichungssitzung initiieren.
- Den spezifischen Datei-Upload-Mechanismus zwischen Client und Server aushandeln.
- Den Datei-Upload-Mechanismus für die Datei-Upload-Sitzung(en) mit dem/den ausgehandelten Mechanismus(en) ausführen.
- Die Datei-Upload-Sitzung(en) abschließen und als abgeschlossen oder abgebrochen markieren.
- Die Veröffentlichungssitzung abschließen, indem die Stage veröffentlicht oder verworfen wird.
- Optional den Status einer Veröffentlichungssitzung überprüfen.
Versionierung
Dieses PEP verwendet dasselbe MAJOR.MINOR-Versionssystem wie in PEP 691, ist aber ansonsten unabhängig versioniert. Die Legacy-API wird von diesem PEP als Version 1.0 betrachtet, aber dieses PEP modifiziert die Legacy-API in keiner Weise.
Die in diesem PEP vorgeschlagene API hat daher die Versionsnummer 2.0.
Sowohl die Haupt- als auch die Nebenversionsnummern der Upload-API **MÜSSEN** nur über den PEP-Prozess geändert werden. Indexbetreiber und Implementierer **DÜRFEN NICHT** neue API-Versionen ohne ein genehmigtes PEP ankündigen oder implementieren. Dies stellt die Konsistenz über alle Implementierungen hinweg sicher und verhindert eine Fragmentierung des Ökosystems.
Inhaltstypen
Wie PEP 691 schlägt dieses PEP vor, dass alle Anfragen und Antworten dieser Upload-API einen Standard-Content-Type haben, der angibt, was der Inhalt ist, welche Version der API er darstellt und welches Serialisierungsformat verwendet wurde.
Dieser Standard-Content-Type für Anfragen gilt für alle Anfragen, **AUSSER** für Anfragen zur Ausführung eines Datei-Upload-Mechanismus, die in der Dokumentation dieses Mechanismus spezifiziert werden.
Die Struktur des Content-Type-Headers für alle anderen Anfragen ist:
application/vnd.pypi.upload.$version+$format
Da kleinere API-Versionsunterschiede niemals störend sein sollten, wird nur die Hauptversion in den Content-Type aufgenommen; die Versionsnummer wird mit einem v vorangestellt.
Die Haupt-API-Version, die im .meta.api-version JSON-Schlüssel von Client-Anfragen angegeben ist, **MUSS** mit dem Content-Type-Header für die Hauptversion übereinstimmen.
Im Gegensatz zu PEP 691 ändert dieses PEP die bestehende *Legacy* 1.0 Upload-API in keiner Weise, daher sind Server verpflichtet, die in diesem PEP beschriebene neue API unter einem anderen Endpunkt als die bestehende Upload-API zu hosten.
Da JSON das einzige in diesem PEP definierte Anfrageformat ist, **MÜSSEN** alle Nicht-Datei-Upload-Anfragen, die in diesem PEP definiert sind, einen Content-Type-Header mit dem Wert
application/vnd.pypi.upload.v2+json.
Ähnlich wie PEP 691 standardisiert dieses PEP auch die serverseitige Inhaltsaushandlung, um Clients die Anforderung verschiedener Versionen oder Serialisierungsformate zu ermöglichen, was den format-Teil des Content-Types einschließt. Da dieses PEP jedoch erwartet, dass die bestehende Legacy 1.0 Upload-API unter einem anderen Endpunkt vorhanden ist und dieses PEP derzeit nur JSON-Serialisierung vorsieht, ist dieser Mechanismus nicht besonders nützlich. Clients haben nur eine Version und Serialisierung, die sie anfordern können. Clients **SOLLTEN** jedoch darauf vorbereitet sein, Inhaltsaushandlung im Falle zukünftiger Ergänzungen von Formaten oder Versionen ordnungsgemäß zu handhaben.
Server **DÜRFEN NICHT** die Unterstützung für API-Versionen über die in genehmigten PEPs definierten hinaus ankündigen. Neue Versionen oder Formate erfordern eine Standardisierung durch ein neues PEP.
Sofern nicht anders angegeben, wird angenommen, dass alle HTTP-Anfragen und -Antworten in diesem Dokument den HTTP-Header enthalten
Content-Type: application/vnd.pypi.upload.v2+json
Stammendpunkt
Alle hier beschriebenen URLs beziehen sich auf den „Stammendpunkt“, der sich irgendwo innerhalb der URL-Struktur einer Domain befinden kann. Zum Beispiel könnte der Stammendpunkt https://upload.example.com/ oder https://example.com/upload/ sein.
Die Wahl des Stammendpunkts überlässt der Indexbetreiber.
Authentifizierung für die Upload 2.0 API
Alle Endpunkte dieser Spezifikation **MÜSSEN** Standard-HTTP-Authentifizierungsmechanismen gemäß RFC 7235 verwenden.
Die Authentifizierung folgt dem Standard-HTTP-Muster:
- Server verwenden den
WWW-AuthenticateAntwortheader, wenn Authentifizierung erforderlich ist. - Clients stellen Anmeldeinformationen über den
AuthorizationAnforderungsheader bereit. 401 Unauthorizedbedeutet fehlende oder ungültige Authentifizierung.403 Forbiddenbedeutet unzureichende Berechtigungen.
Die spezifischen Authentifizierungsschemata (z. B. Bearer, Basic, Digest) werden vom Indexbetreiber festgelegt.
Fehler
Clients sollten im Allgemeinen darauf vorbereitet sein, HTTP-Fehlerstatuscodes zu verarbeiten, die **KÖNNEN** Payloads im folgenden Format enthalten.
{
"meta": {
"api-version": "2.0"
},
"message": "...",
"errors": [
{
"source": "...",
"message": "..."
}
]
}
Neben dem Standard-Schlüssel meta hat dies die folgenden Top-Level-Schlüssel:
message- Eine einzelne Nachricht, die alle Fehler zusammenfasst, die bei dieser Anfrage aufgetreten sein könnten.
errors- Eine Liste spezifischer Fehler, von denen jeder einen
source-Schlüssel enthält, der angibt, woher der Fehler stammt, und einenmessage-Schlüssel für diesen spezifischen Fehler.
Die Zeichenfolgen message und source haben keine spezifische Bedeutung und sind für die menschliche Interpretation bestimmt, um bei der Diagnose des zugrunde liegenden Problems zu helfen.
Einige Antworten können spezifischere HTTP-Statuscodes zurückgeben, wie unten beschrieben.
Veröffentlichungssitzung
Eine Veröffentlichungssitzung erstellen
Ein Release beginnt mit der Erstellung einer neuen Veröffentlichungssitzung. Um die Sitzung zu erstellen, übermittelt ein Client eine POST-Anfrage an die Stamm-URL, wie z. B.:
{
"meta": {
"api-version": "2.0"
},
"name": "foo",
"version": "1.0",
}
Die Anfrage enthält die folgenden Top-Level-Schlüssel:
meta(erforderlich)- Beschreibt Informationen über die Nutzlast selbst. Derzeit ist der einzige definierte Unter-Schlüssel
api-version, dessen Wert die Zeichenfolge"2.0"sein muss. Optionale Unter-Schlüssel können Index-spezifisches Verhalten definieren. name(erforderlich)- Der Name des Projekts, dessen neue Version diese Sitzung zu veröffentlichen versucht. Der Name **MUSS** dem Standardformat für Paketnamen entsprechen und der Server **MUSS** den Namen normalisieren.
version(erforderlich)- Die Version des Projekts, zu der diese Sitzung Dateien hinzufügt. Die Versionszeichenfolge **MUSS** der Paketversionsspezifikation entsprechen.
Nach erfolgreicher Erstellung der Sitzung gibt der Server eine 201 Created-Antwort zurück. Die Antwort **MUSS** auch einen Location-Header enthalten, der auf dieselbe URL verweist wie der Schlüssel links.session im Antwortkörper.
Wenn eine Sitzung für ein Projekt erstellt wird, das noch keine vorherige Veröffentlichung hat, **KANN** der Index den Projektnamen reservieren, bevor die Sitzung veröffentlicht wird, aber er **DARF NICHT** möglich sein, auf dieses Projekt über die „regulären“ (d. h. nicht-gestagte) Zugriffsprotokolle zuzugreifen, *bis* die Stage veröffentlicht ist. Wenn diese erste Veröffentlichungs-Stage abgebrochen wird, **SOLLTE** der Index den Projekt-Datensatz löschen, als wäre er nie hochgeladen worden.
Die Sitzung gehört dem Benutzer, der sie erstellt hat, und alle nachfolgenden Anfragen **MÜSSEN** mit denselben Anmeldeinformationen durchgeführt werden, andernfalls wird bei diesen nachfolgenden Anfragen ein 403 Forbidden zurückgegeben.
Optionale Index-spezifische Metadaten
Indizes können optional ihre eigenen Metadaten für Index-spezifisches Verhalten definieren. Der Metadaten-Schlüssel **MUSS** mit einem Unterstrich beginnen, wobei der folgende Wert den Index leicht und eindeutig identifiziert. Zum Beispiel könnte PyPI die Erstellung von Projekten in einem Organisationskonto ermöglichen, dessen Mitglied der Publisher ist, indem der folgende Index-spezifische Metadatenabschnitt verwendet wird:
{
"meta": {
"api-version": "2.0",
"_pypi.org": {
"organization": "my-main-org"
}
},
"name": "foo",
"version": "1.0",
}
Dies ist nur ein Beispiel. Dieses PEP definiert oder reserviert keine Index-spezifischen Schlüssel oder Metadaten; dies liegt im Ermessen des Index zur Spezifizierung und Dokumentation. Die Semantik (z. B. ob falsche Schlüssel oder Werte zu einem Fehler führen oder ignoriert werden) der Index-spezifischen Metadaten ist hier ebenfalls undefiniert.
Antwortkörper
Die erfolgreiche Antwort enthält den folgenden Inhalt:
{
"meta": {
"api-version": "2.0"
},
"links": {
"stage": "...",
"upload": "...",
"session": "...",
},
"mechanisms": ["http-post-bytes"],
"session-token": "<token-string>",
"expires-at": "2025-08-01T12:00:00Z",
"status": "pending",
"files": {},
"notices": [
"a notice to display to the user"
]
}
Neben dem Schlüssel meta, der das gleiche Format wie die Anfrage-JSON hat, hat die Erfolgsantwort die folgenden Schlüssel:
links- Ein Wörterbuch, das Schlüssel auf URLs abbildet, die sich auf diese Sitzung beziehen, deren Details unten angegeben sind.
mechanisms- Eine Liste von Datei-Upload-Mechanismen, die vom Server unterstützt werden, sortiert nach der Präferenz des Servers. Mindestens ein Wert ist erforderlich.
session-token- Wenn der Index die Vorschau auf gestagte Releases unterstützt, enthält dieser Schlüssel das eindeutige „Sitzungstoken“, das an Installer übergeben werden kann, um den gestagten Release vor der Veröffentlichung in der Vorschau anzuzeigen. Dieses Token **MUSS** kryptografisch nicht erratbar sein. Wenn der Index die Stage-Vorschau nicht unterstützt, **MUSS** dieser Schlüssel weggelassen werden.
expires-at- Eine Zeichenkette mit einem Zeitstempel im RFC 3339-Format; diese Zeichenkette **MUSS** einen UTC-Zeitstempel mit dem „Zulu“-Marker (d. h.
Z) darstellen und nur ganze Sekunden verwenden (d. h. keine Bruchteilsekunden). Dieser Zeitstempel gibt an, wann der Server diese Sitzung und damit alle ihre Inhalte, einschließlich aller hochgeladenen Dateien und der zugehörigen URL-Links, ablaufen lässt. Die Sitzung **SOLLTE** bis mindestens zu diesem Zeitpunkt aktiv bleiben, es sei denn, der Client selbst hat die Sitzung abgebrochen oder veröffentlicht. Server **KÖNNEN** die Ablaufzeit verlängern, sollten sie aber niemals verkürzen. Clients können den Sitzungsstatus abfragen, um die aktuelle Ablaufzeit der Sitzung zu erhalten. status- Eine Zeichenkette, die einen der Werte
pending,published,errorodercanceledenthält, der den Gesamt-Status der Sitzung darstellt. files- Ein Mapping, das die Dateinamen enthält, die in diese Sitzung hochgeladen wurden, zu einem Sub-Mapping mit Details zu jeder Datei, auf die in dieser Sitzung Bezug genommen wird.
notices- Ein optionaler Schlüssel, der auf ein Array von für Menschen lesbaren Informationshinweisen verweist, die der Server dem Endbenutzer mitteilen möchte. Diese Hinweise sind spezifisch für die gesamte Sitzung, nicht für eine bestimmte Datei in der Sitzung.
Mehrere Sitzungserstellungsanfragen
Wenn ein zweiter Versuch, eine Sitzung für dasselbe Namens-Versionspaar zu erstellen, während eine Sitzung für dieses Paar in den Zuständen pending, processing oder complete vorliegt, wird keine neue Sitzung erstellt. Stattdessen **MUSS** der Server mit einem 409 Conflict antworten und einen Location-Header enthalten, der auf die URL des Sitzungsstatus verweist.
Für Sitzungen in den Zuständen error oder canceled wird eine neue Sitzung mit derselben 201 Created-Antwort und demselben Payload erstellt, mit der Ausnahme, dass die Werte für die URL des Veröffentlichungssitzungsstatus, session-token und links.stage unterschiedlich **MÜSSEN** sein.
Links zur Veröffentlichungssitzung
Für den Schlüssel links in der Erfolgs-JSON sind die folgenden Unter-Schlüssel gültig:
session- Der Endpunkt, an dem Aktionen für diese Sitzung ausgeführt werden können, einschließlich der Veröffentlichung dieser Sitzung, des Abbrechens und Verwerfens der Sitzung, des Abfragens des aktuellen Sitzungsstatus und der Anforderung einer Verlängerung der Sitzungsdauer (falls der Server dies unterstützt).
upload- Der Endpunkt, den Sitzungsclients verwenden, um eine Datei-Upload-Sitzung für jede Datei zu initiieren, die in diese Sitzung aufgenommen werden soll.
stage- Der Endpunkt, an dem dieser gestagte Release vor der Veröffentlichung der Sitzung in der Vorschau angezeigt werden kann. Dies kann verwendet werden, um die noch nicht öffentlichen Dateien herunterzuladen und zu verifizieren. Diese URL **MUSS** kryptografisch nicht erratbar sein und **MUSS** das obige
session-tokenverwenden, um diese Einschränkung zu erfüllen. Das genaue Format dieser URL liegt beim Index, sollte aber dokumentiert sein.
Dateien der Veröffentlichungssitzung
Der Schlüssel files enthält ein Mapping von den Namen der in dieser Sitzung hochgeladenen Dateien zu einem Sub-Mapping mit den folgenden Schlüsseln:
status- Eine Zeichenkette mit gültigen Werten wie
pending,processing,complete,errorundcanceled. Wenn während des Uploads ein Fehler aufgetreten ist, sollten Clients nicht davon ausgehen, dass die Datei in einem verwendbaren Zustand ist; es wirderrorzurückgegeben, und es ist am besten, die Datei zu abzubrechen oder zu löschen und von vorne zu beginnen. Diese Aktion würde den Dateinamen aus dem Schlüsselfilesdes Sitzungsstatus-Antwortkörpers entfernen. link- Die *absolute* URL, die der Client zur Referenzierung dieser spezifischen Datei verwenden sollte. Diese URL wird verwendet, um die Referenzdatei abzurufen, zu ersetzen oder zu löschen. Wenn Vorschau-Stages unterstützt werden, **MUSS** diese URL kryptografisch nicht erratbar sein und **MUSS** denselben Veröffentlichungssitzungstoken verwenden, um diese Einschränkung zu gewährleisten. Das genaue Format der URL liegt beim Index, **SOLLTE** aber dokumentiert werden.
notices- Ein optionaler Schlüssel mit ähnlichem Format und ähnlicher Semantik wie der Sitzungsschlüssel
notices, außer dass diese Benachrichtigungen sich auf die referenzierte Datei beziehen.
Eine Veröffentlichungssitzung abschließen
Um eine Sitzung abzuschließen und die darin enthaltenen Dateien zu veröffentlichen, sendet ein Client eine POST-Anfrage an den session Link, der in der Antwort des Sitzungserstellungsvorgangs angegeben ist.
Die Anfrage sieht so aus:
{
"meta": {
"api-version": "2.0"
},
"action": "publish",
}
Wenn der Server die Veröffentlichungssitzung sofort abschließen kann, kann er dies tun und eine Antwort mit dem Statuscode 201 Created zurückgeben. Wenn er die Veröffentlichungssitzung nicht sofort abschließen kann (z. B. wenn eine Validierung erforderlich ist, die länger als ein HTTP-Anfrage-Timeout dauert), kann er eine Antwort mit dem Statuscode 202 Accepted zurückgeben.
Der Server **MUSS** in der Antwort einen Location-Header einfügen, der auf die URL des Veröffentlichungssitzungsstatus verweist, die zur Abfrage des aktuellen Sitzungsstatus verwendet werden kann. Wenn der Server eine Antwort mit 202 Accepted zurückgegeben hat, kann das Abfragen dieser URL verwendet werden, um auf Änderungen des Sitzungsstatus zu warten.
Abbruch der Veröffentlichungssitzung
Um eine Veröffentlichungssitzung abzubrechen, sendet ein Client eine DELETE-Anfrage an den session Link, der in der Antwort des Sitzungserstellungsvorgangs angegeben ist. Der Server markiert die Sitzung dann als abgebrochen und **SOLLTE** alle Daten löschen, die im Rahmen dieser Sitzung hochgeladen wurden. Zukünftige Zugriffsversuche auf diese Sitzungs-URL oder eine der Veröffentlichungssitzungs-URLs **MÜSSEN** eine Antwort mit dem Statuscode 404 Not Found zurückgeben.
Um hängende Sitzungen zu verhindern, können Server auch abgelaufene Sitzungen eigenständig abbrechen. Es wird empfohlen, dass Server ihre Sitzungen nach nicht weniger als einer Woche löschen, aber jeder Server kann seinen eigenen Zeitplan wählen. Server **KÖNNEN** clientgesteuerte Sitzungserweiterungen unterstützen.
Status der Veröffentlichungssitzung
Ein Client kann jederzeit den Status einer Sitzung abfragen, indem er eine GET-Anfrage an die URL sendet, die im links.session-URL (ebenfalls im Location-Header der Antwort des Sitzungserstellungsvorgangs) angegeben ist.
Der Server wird auf diese GET-Anfrage mit derselben Antwort des Veröffentlichungssitzungserstellungsvorgangs antworten, die er beim anfänglichen Erstellen der Veröffentlichungssitzung erhalten hat, mit Ausnahme von Änderungen an status, expires-at oder files.
Erweiterung der Veröffentlichungssitzung
Server **KÖNNEN** es Clients erlauben, Sitzungen zu verlängern, aber die Gesamtlaufzeit und die Anzahl der erlaubten Verlängerungen liegen im Ermessen des Servers. Um eine Sitzung zu verlängern, sendet ein Client eine POST-Anfrage an die links.session-URL (wie oben, auch der Location-Header).
Die Anfrage sieht so aus:
{
"meta": {
"api-version": "2.0"
},
"action": "extend",
"extend-for": 3600
}
Die angegebene Anzahl von Sekunden ist nur ein Vorschlag an den Server für die Anzahl zusätzlicher Sekunden, um die aktuelle Sitzung zu verlängern. Wenn der Client beispielsweise die aktuelle Sitzung um eine weitere Stunde verlängern möchte, wäre extend-for 3600. Nach erfolgreicher Verlängerung antwortet der Server mit derselben Antwort des Veröffentlichungssitzungserstellungsvorgangs, die er beim anfänglichen Erstellen der Veröffentlichungssitzung erhalten hat, mit Ausnahme von Änderungen an status, expires-at oder files.
Wenn der Server sich weigert, die Sitzung um die angeforderte Anzahl von Sekunden zu verlängern, **MUSS** er dennoch eine erfolgreiche Antwort zurückgeben, und der Schlüssel expires-at wird einfach die aktuelle Ablaufzeit der Sitzung widerspiegeln.
Token der Veröffentlichungssitzung
Indizes **SOLLTEN** Vorschau-Stufen unterstützen, damit hochgeladene Dateien live getestet werden können, bevor sie veröffentlicht werden. Z. B. könnte ein CI-Client Installations-Tests mit vorveröffentlichten Wheels durchführen, um sicherzustellen, dass seine neue Version wie erwartet funktioniert, bevor er die Version öffentlich veröffentlicht.
Indizes werben mit der Unterstützung für gestufte Vorschauen, indem sie zwei wichtige Informationen in ihrer Antwort auf die Erstellung von Veröffentlichungssitzungen zurückgeben. Indizes, die keine gestuften Vorschauen unterstützen, **dürfen** diese nicht in ihren Antworten enthalten.
Der session-token ist ein kurzer Token, der als Bequemlichkeit für die Benutzererfahrung von Installationstools verwendet werden könnte, wenn diese gestufte Vorschauen über einen Kommandozeilen-Schalter unterstützen möchten, z. B. $TOOL install --staging $SESSION_TOKEN. Der Schlüssel links.stage gibt die vollständige URL zur Stufe an, die in der CLI verwendet werden könnte, z. B. pip install --extra-index-url $STAGE_URL. Sowohl der Sitzungstoken als auch die URL **MÜSSEN** kryptografisch nicht erratbar sein, aber der Algorithmus zur Generierung des Tokens liegt beim Index. Die Stufen-URL **MUSS** aus dem Sitzungstoken berechenbar sein, unter Verwendung eines vom Index dokumentierten Formats, aber das genaue Format der URL liegt ebenfalls beim Index.
Datei-Upload-Sitzung
Eine Datei-Upload-Sitzung erstellen
Nachdem eine Veröffentlichungssitzung erstellt wurde, wird der upload-Endpunkt aus der session-Links-Zuordnung der Antwort verwendet, um den Upload neuer Dateien in diese Sitzung zu starten. Clients **MÜSSEN** die bereitgestellte upload-URL verwenden und **dürfen NICHT** davon ausgehen, dass es ein Muster oder eine Gemeinsamkeit dieser URLs von einer Sitzung zur nächsten gibt.
Um einen Dateiupload zu initiieren, sendet ein Client zuerst eine POST-Anfrage an die upload-URL. Die Anfrage sieht so aus:
{
"meta": {
"api-version": "2.0"
},
"filename": "foo-1.0.tar.gz",
"size": 1000,
"hashes": {"sha256": "...", "blake2b": "..."},
"metadata": "...",
"mechanism": "http-post-bytes"
}
Neben dem Standardschlüssel meta enthält das JSON der Anfrage die folgenden zusätzlichen Schlüssel:
filename(erforderlich)- Der Name der hochzuladenden Datei. Der Dateiname **MUSS** entweder der Spezifikation für Quellcode-Distributionsdateinamen oder der Konvention für Binärdistributionsdateinamen entsprechen. Indizes **SOLLTEN** diese Dateinamen zum Zeitpunkt der Anfrage validieren und einen Fehlercode
400 Bad Requestzurückgeben, wie im Abschnitt Fehler beschrieben, wenn die Dateinamen nicht konform sind. size(erforderlich)- Die Größe der hochzuladenden Datei in Bytes.
hashes(erforderlich)- Eine Zuordnung von Hash-Namen zu hexadezimal kodierten Digests. Jeder dieser Digests sind die Prüfsummen der hochzuladenden Datei, wenn sie mit dem im Namen identifizierten Algorithmus gehasht wird.
Standardmäßig kann jeder im hashlib verfügbare Hash-Algorithmus als Schlüssel für das
hashes-Dictionary verwendet werden [3]. Mindestens ein sicherer Algorithmus aushashlib.algorithms_guaranteed**MUSS** immer enthalten sein. Dieses PEP empfiehlt speziellsha256.Mehrere Hashes können gleichzeitig übergeben werden, aber alle bereitgestellten Hashes **MÜSSEN** für die Datei gültig sein.
mechanism(erforderlich)- Die für diese Datei vom Client beabsichtigten Upload-Mechanismen. Dieser Mechanismus **SOLLTE** aus der Liste der im Antwort des Veröffentlichungssitzungserstellungsvorgangs beworbenen Mechanismen ausgewählt werden. Ein Client **KANN** einen Mechanismus senden, der nicht beworben wird, in Fällen, in denen Serverbetreiber einen neuen oder bevorstehenden Mechanismus dokumentiert haben, der auf "Vorabversion"-Basis verfügbar ist.
metadata(optional)- Falls vorhanden, ist dies ein Zeichenkettenwert, der die Kernmetadaten der Datei enthält.
Server **KÖNNEN** die in dieser Anfrage bereitgestellten Daten für einige Plausibilitätsprüfungen verwenden, bevor sie den Upload der Datei zulassen. Diese Prüfungen können umfassen, sind aber nicht beschränkt auf:
- Prüfung, ob der
filenamebereits in einer veröffentlichten Version vorhanden ist; - Prüfung, ob die
sizeein Projekt- oder Dateikontingent überschreiten würde; - Prüfung, ob der Inhalt der
metadata, falls vorhanden, gültig ist.
Wenn der Server feststellt, dass der Upload fortgesetzt werden soll, gibt er eine Antwort mit 202 Accepted mit dem unten stehenden Antwortkörper zurück. Der Status der Veröffentlichungssitzung enthält auch den Dateinamen in der files-Zuordnung. Wenn der Server einen Upload nicht fortsetzen kann, weil der vom Client bereitgestellte mechanism nicht unterstützt wird, **MUSS** er eine Antwort mit 422 Unprocessable Content zurückgeben. Der Server **KANN** parallele Uploads von Dateien zulassen, ist aber nicht dazu verpflichtet. Wenn der Server feststellt, dass der Upload nicht fortgesetzt werden kann, **MUSS** er eine Antwort mit 409 Conflict zurückgeben.
Antwortkörper
Die erfolgreiche Antwort enthält Folgendes:
{
"meta": {
"api-version": "2.0"
},
"links": {
"file-upload-session": "..."
},
"status": "pending",
"expires-at": "2025-08-01T13:00:00Z",
"mechanism": {
"identifier": "http-post-bytes",
"file_url": "...",
"attestations_url": "..."
}
}
Ein Retry-After-Antwort-Header **MUSS** vorhanden sein, um den Clients mitzuteilen, wann sie als Nächstes nach einem aktualisierten Status abfragen sollen.
Neben dem Schlüssel meta, der das gleiche Format wie die Anfrage-JSON hat, hat die Erfolgsantwort die folgenden Schlüssel:
links- Ein Dictionary, das Schlüssel zu URLs im Zusammenhang mit dieser Sitzung zuordnet. Die Details werden unten bereitgestellt.
status- Eine Zeichenkette mit den gültigen Werten
pending,processing,complete,errorundcanceled, die den aktuellen Zustand der Datei-Upload-Sitzung angibt. expires-at- Ein Zeitstempel-String im RFC 3339-Format, der angibt, wann der Server diese Datei-Upload-Sitzung ablaufen lässt. Dieser String **MUSS** einen UTC-Zeitstempel mit dem „Zulu“-Marker (d. h.
Z) darstellen und nur ganze Sekunden (d. h. keine Bruchteile von Sekunden) verwenden. Die Sitzung **sollte** bis zu dieser Zeit aktiv bleiben, es sei denn, der Client bricht sie ab oder schließt sie ab. Server **KÖNNEN** wählen, diese Ablaufzeit zu verlängern, sollten sie aber niemals vorverlegen. mechanism- Eine Zuordnung, die die notwendigen Details für den unterstützten Mechanismus enthält, wie er vom Client und Server ausgehandelt wurde. Diese Zuordnung **MUSS** einen Schlüssel
identifierenthalten, der auf die Identifikatorzeichenkette für den gewählten Datei-Upload-Mechanismus abgebildet ist.
Links zur Datei-Upload-Sitzung
Für den Schlüssel links in der Antwortnutzlast sind die folgenden Unterschlüssel gültig:
file-upload-session- Der Endpunkt, an dem Aktionen für diese Datei-Upload-Sitzung ausgeführt werden können, einschließlich Abschluss einer Datei-Upload-Sitzung, Abbrechen und Verwerfen der Datei-Upload-Sitzung, Abfragen des aktuellen Status der Datei-Upload-Sitzung und Anfordern einer Verlängerung der Lebensdauer der Datei-Upload-Sitzung (falls der Server dies unterstützt).
Eine Datei-Upload-Sitzung abschließen
Um eine Datei-Upload-Sitzung abzuschließen, was bedeutet, dass der Datei-Upload-Mechanismus ausgeführt wurde und keine Fehler erzeugt hat, sendet ein Client eine POST an den file-upload-session-Link in der Antwort des Datei-Upload-Sitzungserstellungsvorgangs.
Die Anfrage sieht so aus:
{
"meta": {
"api-version": "2.0"
},
"action": "complete",
}
Wenn der Server die Datei-Upload-Sitzung sofort abschließen kann, kann er dies tun und eine Antwort mit 201 Created zurückgeben und den Status der Datei-Upload-Sitzung auf complete setzen. Wenn er die Datei-Upload-Sitzung nicht sofort abschließen kann (z. B. wenn eine Validierung erforderlich ist, die länger als eine HTTP-Anfrage dauern könnte), kann er eine Antwort mit 202 Accepted zurückgeben und den Status der Datei-Upload-Sitzung auf processing setzen.
In beiden Fällen sollte der Server einen Location-Header einfügen, der auf die URL des Status der Datei-Upload-Sitzung verweist.
Server **MÜSSEN** es Clients erlauben, die URL des Datei-Upload-Sitzungsstatus abzufragen, um auf Statusänderungen zu warten. Wenn der Server mit 20 Accepted antwortet, können Clients die URL des Datei-Upload-Sitzungsstatus abfragen, um auf Statusänderungen zu warten. Clients **SOLLTEN** den Retry-After-Header-Wert der Antwort des Datei-Upload-Sitzungsstatus respektieren.
Abbruch und Löschung
Ein Client kann eine laufende Datei-Upload-Sitzung abbrechen oder eine bereits vollständig hochgeladene Datei löschen. In beiden Fällen führt der Client dies durch Senden einer DELETE-Anfrage an die URL links.file-upload-session aus der Antwort des Datei-Upload-Sitzungserstellungsvorgangs der Datei, die er löschen möchte.
Eine erfolgreiche Löschanfrage **MUSS** mit einer Antwort vom Typ 204 No Content beantwortet werden.
Nach dem Abbrechen oder Löschen **darf** ein Client nicht davon ausgehen, dass die vorherige Datei-Upload-Sitzungsressource oder zugehörige Datei-Upload-Mechanismen wiederverwendet werden können.
Ersetzen einer teilweise oder vollständig hochgeladenen Datei
Um eine Sitzungsdatei zu ersetzen, **MUSS** die Datei-Uploadsitzung zuvor abgeschlossen, abgebrochen oder gelöscht worden sein. Es ist nicht möglich, eine Datei zu ersetzen, wenn der Upload für diese Datei noch läuft.
Um eine Sitzungsdatei zu ersetzen, sollten Clients zuerst den laufenden Upload abbrechen und löschen. Danach kann der neue Datei-Upload eingeleitet werden, indem die gesamte Datei-Upload-Sequenz erneut gestartet wird. Das bedeutet, die Metadatenanfrage erneut zu stellen, um eine neue Upload-Ressourcen-URL zu erhalten. Clients **dürfen NICHT** davon ausgehen, dass die vorherige Upload-Ressourcen-URL nach dem Löschen wiederverwendet werden kann.
Status der Datei-Upload-Sitzung
Der Client kann den Status der Datei-Upload-Sitzung abfragen, indem er eine GET-Anfrage an die URL links.file-upload-session aus der Antwort des Datei-Upload-Sitzungserstellungsvorgangs sendet. Der Server antwortet auf diese Anfrage mit derselben Nutzlast wie die Antwort des Datei-Upload-Sitzungserstellungsvorgangs, mit Ausnahme von Änderungen an status und expires-at.
Erweiterung der Datei-Upload-Sitzung
Server **KÖNNEN** es Clients erlauben, Datei-Upload-Sitzungen zu verlängern, aber die Gesamtlaufzeit und die Anzahl der erlaubten Verlängerungen liegen im Ermessen des Servers. Um eine Datei-Upload-Sitzung zu verlängern, sendet ein Client eine POST-Anfrage an die URL links.file-upload-session aus der Antwort des Datei-Upload-Sitzungserstellungsvorgangs.
Die Anfrage sieht so aus:
{
"meta": {
"api-version": "2.0"
},
"action": "extend",
"extend-for": 3600
}
Die angegebene Anzahl von Sekunden ist nur ein Vorschlag an den Server für die Anzahl zusätzlicher Sekunden, um die aktuelle Datei-Upload-Sitzung zu verlängern. Wenn der Client beispielsweise die Sitzung um eine weitere Stunde verlängern möchte, wäre extend-for 3600. Nach erfolgreicher Verlängerung antwortet der Server mit derselben Antwort des Datei-Upload-Sitzungserstellungsvorgangs, die er beim anfänglichen Erstellen der Veröffentlichungssitzung erhalten hat, mit Ausnahme von Änderungen an status oder expires-at.
Wenn der Server sich weigert, die Sitzung um die angeforderte Anzahl von Sekunden zu verlängern, **MUSS** er dennoch eine erfolgreiche Antwort zurückgeben, und der Schlüssel expires-at wird einfach die aktuelle Ablaufzeit der Sitzung widerspiegeln.
Staging-Vorschauen
Die Möglichkeit, gestufte Releases vor ihrer Veröffentlichung in der Vorschau anzuzeigen, ist ein wichtiges Merkmal dieses PEPs und ermöglicht eine zusätzliche letzte Teststufe, bevor die Release öffentlich verfügbar ist. Indizes **KÖNNEN** diese Funktionalität über die URL bereitstellen, die im Unterschlüssel stage des links-Schlüssels zurückgegeben wird, wenn die Veröffentlichungssitzung erstellt wird. Die stage-URL kann an Installer wie pip übergeben werden, indem das Flag –extra-index-url auf diesen Wert gesetzt wird. Mehrere Stufen können sogar in der Vorschau angezeigt werden, indem dieses Flag mit mehreren Werten wiederholt wird.
Wenn unterstützt, gibt der Index Ansichten zurück, die die gestuften Releases dem Installer-Tool offenlegen und sie zum Download und zur Installation in virtuellen Umgebungen für dieses letzte Testen verfügbar machen. Diese Option ermöglicht es bestehenden Installern, gestufte Releases mit keinerlei Änderungen am Installer-Tool in der Vorschau anzuzeigen. Die Details dieser Benutzererfahrung bleiben den Wartern des Installer-Tools überlassen.
Datei-Upload-Mechanismen
Server **MÜSSEN** die erforderlichen Datei-Upload-Mechanismen implementieren. Solche Mechanismen dienen als Fallback, wenn keine serverseitigen Implementierungen existieren.
Jede Hauptversion der Upload-API **MUSS** mindestens einen erforderlichen Datei-Upload-Mechanismus spezifizieren.
Neue erforderliche Mechanismen **dürfen NICHT** hinzugefügt und bestehende erforderliche Mechanismen **dürfen NICHT** entfernt werden, ohne ein Update der Hauptversion. Serverseitig spezifische oder experimentelle Mechanismen, die hinzugefügt oder entfernt werden, **dürfen die Haupt- oder Nebenversionsnummer dieser Spezifikation NICHT ändern**.
Erforderliche Datei-Upload-Mechanismen
http-post-bytes
Server, die der Upload-API-Version 2.0 entsprechen, **MÜSSEN** den http-post-bytes-Mechanismus unterstützen.
Dieser Mechanismus **MUSS** dasselbe Authentifizierungsschema wie die übrigen Endpunkte des Upload-2.0-Protokolls verwenden.
Ein Client führt diesen Mechanismus aus, indem er eine POST-Anfrage an die file_url sendet, die in der http-post-bytes-Map der mechanism-Map der Antwort des Datei-Upload-Sitzungserstellungsvorgangs zurückgegeben wird, wie folgt:
Content-Type: application/octet-stream
<binary contents of the file to upload>
Server **KÖNNEN** den Upload digitaler Bestätigungen für Dateien unterstützen (siehe PEP 740). Diese Unterstützung wird durch die Aufnahme eines Schlüssels attestations_url in der http-post-bytes-Map der mechanism-Map der Antwort des Datei-Upload-Sitzungserstellungsvorgangs angezeigt. Bestätigungen **MÜSSEN** vor der Abschluss der Datei-Upload-Sitzung an die attestations_url hochgeladen werden.
Um eine Bestätigung hochzuladen, sendet ein Client eine POST-Anfrage an die attestations_url, die ein JSON-Array von Bestätigungsobjekten enthält, wie folgt:
Content-Type: application/json
[{"version": 1, "verification_material": {...}, "envelope": {...}},...]
Serverspezifische Datei-Upload-Mechanismen
Ein bestimmter Server **KANN** eine beliebige Anzahl von serverseitig spezifischen Mechanismen implementieren und ist dafür verantwortlich, deren Verwendung zu dokumentieren.
Eine serverseitig spezifische Implementierung eines Datei-Upload-Mechanismus-Identifikators hat drei Teile:
<prefix>-<operator identifier>-<implementation identifier>
Serverseitig spezifische Implementierungen **MÜSSEN** vnd als ihr prefix verwenden. Der operator-identifier **sollte** den Serverbetreiber klar identifizieren, eindeutig von anderen bekannten Indizes sein und nur alphanumerische Zeichen [a-z0-9] enthalten. Der implementation-identifier **sollte** die zugrunde liegende Implementierung prägnant beschreiben und nur alphanumerische Zeichen [a-z0-9] und - enthalten.
Wenn Serverbetreiber wesentliche Änderungen an ihren Upload-Mechanismen vornehmen müssen, **sollten** sie einen neuen Mechanismus-Identifikator erstellen, anstatt den bestehenden zu ändern. Das empfohlene Muster ist, einen Versionsuffix wie -v1, -v2 usw. an den Implementierungs-Identifikator anzuhängen. Dies ermöglicht es Clients, sich explizit für neue Versionen zu entscheiden und gleichzeitig die Abwärtskompatibilität mit bestehenden Clients aufrechtzuerhalten.
Zum Beispiel:
| Datei-Upload-Mechanismus-Zeichenkette | Serverbetreiber | Mechanismusbeschreibung |
|---|---|---|
vnd-pypi-s3multipart-presigned |
PyPI | S3-Multipart-Upload über vorunterzeichnete URL |
vnd-pypi-s3multipart-presigned-v2 |
PyPI | S3-Multipart-Upload über vorunterzeichnete URL Version 2 |
vnd-pypi-http-fetch |
PyPI | Datei geliefert durch Anweisung an den Server, von einer URL per HTTP-Anfrage abzurufen |
vnd-acmecorp-http-fetch |
Acme Corp | Datei geliefert durch Anweisung an den Server, von einer URL per HTTP-Anfrage abzurufen |
vnd-acmecorp-postal |
Acme Corp | Datei per Post geliefert |
vnd-widgetinc-stream-v1 |
Widget Inc. | Streaming-Upload-Protokoll Version 1 |
vnd-widgetinc-stream-v2 |
Widget Inc. | Streaming-Upload-Protokoll Version 2 |
vnd-madscience-quantumentanglement |
Mad Science Labs | Upload per Quantenverschränkung |
Wenn ein Server beabsichtigt, das Verhalten der Implementierung eines anderen Servers genau nachzubilden, **KANN** er mit dem Namen des Datei-Upload-Mechanismus dieser Implementierung antworten.
FAQ
Bedeutet dies, dass PyPI die Unterstützung für die bestehende Upload-API einstellen wird?
Derzeit hat PyPI keine konkreten Pläne, die Unterstützung für die bestehende Upload-API einzustellen.
Im Gegensatz zu PEP 691 gibt es erhebliche Vorteile, dies zu tun. Daher wird die Unterstützung für die Legacy-Upload-API wahrscheinlich in Zukunft (verantwortungsvoll) eingestellt und entfernt werden. Die Planung zukünftiger Abschaffungen liegt ausdrücklich außerhalb des Rahmens *dieses* PEPs.
Kann ich die Upload 2.0 API verwenden, um einen Projektnamen zu reservieren?
Ja! Wenn Sie noch keine Dateien hochladen möchten, um eine Veröffentlichung zu erstellen, können Sie trotzdem einen Projektnamen reservieren (vorausgesetzt natürlich, der Name existiert noch nicht).
Um dies zu tun, erstellen Sie eine neue Veröffentlichungssitzung und dann veröffentlichen Sie die Sitzung, ohne Dateien hochzuladen. Obwohl der Schlüssel version im JSON-Körper der Sitzungserstellungsanfrage erforderlich ist, können Sie einfach eine Platzhalterversionsnummer wie "0.0.0a0" verwenden. Die Version wird ignoriert, wenn keine Artefakte hochgeladen werden.
Im Allgemeinen wird der Benutzer, der die Sitzung erstellt hat, zum Eigentümer des neuen Projekts. Der Index könnte jedoch indexspezifische Metadaten definieren, um beispielsweise einer Organisation, deren Mitglied der Publisher ist, den Besitz des neuen Projekts zu ermöglichen.
Offene Fragen
Erweiterungen des Upload 2.0 Protokolls
Funktionen wie asynchrone Webhook-Benachrichtigungen bei Abschluss der Upload-Verarbeitung wurden während der Überprüfung dieses PEPs besprochen. Das Konzept einer Fähigkeitserweiterung für das Upload-Protokoll wurde diskutiert, die es Implementierern ermöglichen würde, die Unterstützung für optionale Funktionen wie asynchrone Benachrichtigungen oder Webhooks anzuzeigen.
Diese Idee wurde aufgrund der Komplexität bei der Gestaltung eines solchen Erweiterungsprotokolls und der Sicherstellung, dass es nicht zu übermäßiger Fragmentierung des Ökosystems führt, während Upload 2.0 eingeführt wird, offengelassen.
Zukünftige Überarbeitungen des Upload-Protokolls sollten solche Erweiterungen untersuchen, sobald Erfahrungen mit dem Betrieb von Upload 2.0 gesammelt wurden.
Fußnoten
Änderungshistorie
- 23. Sep. 2025
- Entfernen Sie den
nonceund dengentoken()-Algorithmus. Indizes sind nun für die Generierung eines kryptografisch sicheren Sitzungstokens und einer verschleierten Stufen-URL verantwortlich (aber nur, wenn sie gestufte Vorschauen unterstützen). - Klären Sie die Semantik, wenn mehrere Anfragen zur Sitzungserstellung empfangen werden.
- Klären Sie die Schritte der Veröffentlichungssitzung, wie z. B. Status-Polling und Sitzungserweiterung.
- Verlangen Sie, dass
nameden Normalisierungsregeln entspricht und einen Link enthält. - Verlangen Sie, dass
versionden Versionsspezifikationen entspricht und einen Link enthält. - Verlangen Sie, dass
filenameentweder der Quellcode- oder der Binärdistributions-Dateinamenkonvention entspricht, und fügen Sie Links hinzu. - Referenzieren Sie RFC 3399 anstelle von ISO 8601 als Zeitstempel-Spezifikation. Der RFC ist ein einfacheres Format, das den ISO-Standard unterteilt und für unseren Anwendungsfall besser geeignet ist.
- Andere Protokollklarstellungen.
- Fügen Sie optionale indexspezifische Metadatenschlüssel hinzu.
- Entfernen Sie den
- 06. Aug. 2025
- Fügen Sie Dustin als PEP-Delegierten hinzu.
- 14. Apr. 2025
- Updates basierend auf den PyCon US-Diskussionen.
- Einige Beschreibungen von Fehler-Rückgabecodes wurden hinzugefügt, wo sie unterdefiniert waren.
- Kombinieren Sie das Abbrechen und Löschen von Upload-Dateien in einem Abschnitt.
- Vereinfachen Sie die Regeln für das Ersetzen einer bereitgestellten, aber noch nicht veröffentlichten Datei.
- Fügen Sie eine offene Frage zum Aufschieben von Staging-Vorschauen hinzu.
- Einige Rechtschreibfehler und schlecht formulierte Texte korrigiert.
- 06-Jan-2025
- PEP wiederbelebt und aktualisiert.
- Barry als Koautor hinzugefügt.
- Terminologie auf "stage" (bereitstellen) standardisiert anstelle von "draft" (Entwurf).
- Die Stamm-URL für PyPI als https://upload.pypi.org/2.0 vorgeschlagen.
- Einen optionalen
nonce-Schlüssel zur Sitzungsverschleierung hinzugefügt. - JSON-Schlüssel standardisiert und mit der Terminologie konsistent gemacht.
- Mehrere APIs hinzugefügt und geändert, Lücken gefüllt und Details elaboriert.
- Upload-Protokoll an den Entwurf des Internetstandards angepasst.
Urheberrecht
Dieses Dokument wird in die Public Domain oder unter die CC0-1.0-Universal-Lizenz gestellt, je nachdem, welche Lizenz permissiver ist.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0694.rst
Zuletzt geändert: 2025-09-28 21:11:14 GMT