DokuPython API und Fehler
Ausnahmen und Fehler
Eine Anfrage kann an vier Stellen fehlschlagen, und Nexy antwortet jeweils anders. Diese Seite ist der Index: Suchen Sie den Status, den Sie sehen, dann die Zeile, die ihn erzeugt hat, und dann die Datei, die den Hauptteil bestimmt.
Die Kurzversion
| Was ist passiert? | Status | Browser sieht | API-Client sieht |
|---|---|---|---|
| Keine Route entspricht der URL | 404 |
notfound.nexy, sonst die eingebaute Seite |
{"detail": "Not Found"} |
| Ein Pfadsegment passt nicht zu seiner Anmerkung | 404 |
die gleiche Seite | {"detail": "Not Found"} |
| Ein Abfrage-, Header-, Cookie- oder Textfeld fehlt oder ist ungültig | 422 |
FastAPIs JSON-Text | FastAPIs JSON-Text |
notFound() |
404 |
die Seite | {"detail": ...} |
unauthorized() |
401 |
die integrierte Seite | {"detail": ...} |
forbidden() |
403 |
die integrierte Seite | {"detail": ...} |
raise HTTPException(409, ...) |
409 |
die integrierte Seite | {"detail": ...} |
| Eine Ausnahme, nichts gefangen | 500 |
errors.nexy, sonst die eingebaute Seite |
{"detail", "reference"} |
redirect(url) |
307 |
das Ziel, keine Seite | das Ziel, kein Körper |
permanentRedirect(url) |
308 |
das Ziel, keine Seite | das Ziel |
Ein API-Client ist eine Anfrage, deren Header Accept nach JSON und nicht nach einer Seite fragt:
curl -H "Accept: application/json" http://localhost:3000/api/items/500# {"detail":"Out of range"}
Woher ein Fehler kommt
Browser ──► Middleware ──► Router ──► Page or handler
│ │ │
│ │ ├─ return ───────────► 200
│ │ ├─ HTTPException ────► its status
│ │ └─ other exception ───► 500
│ └─ no match ────────────────────────► 404
└─ raises ──────────────────────────────────────► 500| Bühne | Was kann scheitern | Die Antwort |
|---|---|---|
| Middleware | Ihre middleware.py, CORS, Sitzungen |
der Status der Ausnahme, sonst 500 |
| Router | Die URL stimmt mit keiner Datei überein | 404 |
| Validierung | Ein Pfadsegment kann nicht konvertiert werden | 404 |
| Validierung | ein Abfrage-, Header-, Cookie- oder Textfeld | 422 |
| Seite, Handler, Aktion, Wache | HTTPException |
seinen Status |
| Seite, Handler, Aktion, Wache | irgendetwas anderes | 500 |
Von überall losfahren
redirect, permanentRedirect, notFound, forbidden und unauthorized lösen eine HTTP-Ausnahme aus, sodass derselbe Aufruf auf einer .nexy-Seite, einem API-Handler, einem modularen Controller, einem Guard, einem dependencies.py und einer Aktion funktioniert.
from nexy import notFound, redirect from src.posts import find async def GET(slug: str): post = find(slug) if post is None: notFound("No such post") if post.moved_to: redirect(post.moved_to) return postfrom nexy import notFound, redirectfrom nexy.decorators import Controller from src.posts import find @Controller("/posts/{slug}")class PostsBySlugController: async def get(self, slug: str): post = find(slug) if post is None: notFound("No such post") if post.moved_to: redirect(post.moved_to) return postListen Sie den Controller im controllers des Root-Moduls auf.
| Rufen Sie an | Antwort | Wann |
|---|---|---|
notFound(detail=None) |
404 |
Die Ressource existiert nicht |
unauthorized(detail=None, scheme=None) |
401 |
Der Besucher muss sich zunächst anmelden |
forbidden(detail=None) |
403 |
Der Besucher ist zwar bekannt, sieht dies aber möglicherweise nicht |
redirect(url, status=307) |
307 |
Schicken Sie sie woanders hin und behalten Sie dabei die Methode bei |
redirect(url, status=303) |
303 |
nach einem Formular: Die nächste Anfrage ist ein GET |
permanentRedirect(url) |
308 |
eine verschobene Seite, an die sich Suchmaschinen erinnern sollten |
Bauen Sie das Ziel auf der Grundlage von Werten auf, denen Sie vertrauen. redirect(request.query_params["next"]) schickt Besucher dorthin, wo der Link steht; Es handelt sich um eine offene Weiterleitung. Ein Ziel, das einen Zeilenumbruch enthält, wird abgelehnt.
Validierung: 422 oder 404
Handler-Parameter werden von FastAPI anhand ihrer Anmerkungen validiert.
from nexy.http import Header async def GET(q: str, limit: int = 10, x_token: str = Header(...)): return {"q": q, "limit": limit}from nexy.decorators import Controllerfrom nexy.http import Header @Controller("/api/search")class SearchApiController: async def get(self, q: str, limit: int = 10, x_token: str = Header(...)): return {"q": q, "limit": limit}Listen Sie den Controller im controllers des Root-Moduls auf.
| Problem | Status | Warum |
|---|---|---|
| Fehlendes oder ungültiges Abfrage-, Header-, Cookie- oder Textfeld | 422 |
Die Anfrage hat den Handler erreicht, die Daten sind falsch |
Ungültiges Pfadsegment (/api/users/abc für id: int) |
404 |
Der Ordner hat keine Route für eine Nicht-Nummer, daher existiert die URL nicht |
Der 422-Körper hat die Standardform von FastAPI, sodass Clients und generierte SDKs weiterhin funktionieren:
{"detail": [{"loc": ["query", "q"], "msg": "Field required", "type": "missing"}]}
Für ein Formular oder eine Aktion erhält der Client ein ActionError mit status und detail; a 422 füllt auch error.fields mit einer Nachricht pro Feld. Siehe Aktionen.
Benutzerdefinierte Fehlerseiten
<h1>Page not found</h1><p>The link may be old. <a href="/">Start from the home page</a>.</p><h1>Something went wrong</h1><p>Try again in a moment.</p>| Datei | Status | Umfang |
|---|---|---|
src/routes/notfound.nexy |
404 |
jede Route des Projekts |
src/routes/errors.nexy |
500 |
jede Route des Projekts |
src/routes/forbidden.nexy |
403 |
jede Route des Projekts |
src/routes/unauthorized.nexy |
401 |
jede Route des Projekts |
src/routes/blog/notfound.nexy |
404 |
/blog und darunter |
src/routes/blog/errors.nexy |
500 |
/blog und darunter |
src/routes/loading.nexy |
- | reserviert, noch kein Laufzeiteffekt |
Eine Datei irgendwo in den Routen installiert die Antwort für ihren Status: Eine Kopie im Stammverzeichnis antwortet auf das gesamte Projekt, eine Kopie in einem Ordner antwortet auf diesen Ordner und die tiefste Datei, die mit der URL übereinstimmt, gewinnt. Eine URL außerhalb jeder Kopie und ein Status ohne Datei führen zu den integrierten gestalteten Seiten. Siehe Fehlerseiten pro Ordner.
Der modulare Router hat keine Fehlerseite in einer Datei: 404, 500, 403 oder 401 erhält die integrierte gestaltete Seite. Fehlerseiten pro Ordner sind eine Konvention des dateibasierten Routers.
Nicht behandelte Ausnahmen
Eine Ausnahme, bei der nichts abgefangen wurde, wird einmalig protokolliert, mit ihrer Referenz, woher sie kam und dem Code um sie herum. Der Status ist 500 und der Körper ist von der Umgebung abhängig.
nexy dev |
nexy build dann nexy start |
|
|---|---|---|
| Browser | den Fehler, die Zeilen Ihres Codes und den Traceback | errors.nexy, sonst die integrierte Seite, mit einer Referenz |
| API-Client | {"detail", "reference", "error"} |
{"detail", "reference"} |
| Terminal | die Ausnahme und die Zeilen Ihres Codes | die Ausnahme, der gesamte Traceback und die Referenz |
x ZeroDivisionError: division by zero GET /boom ref fe6a5217 at src/routes/boom.py:2 in GET 1 | def GET(): 2 | return {"a": 1 / 0}
Die Referenz besteht aus acht Zeichen und ist für jeden Fehler neu. Ein Besucher kann es zitieren, und Sie finden den Traceback, indem Sie das Protokoll danach durchsuchen. Weder die Ausnahme noch der Code erreichen den Besucher in der Produktion.
Aktionen und Formen
Eine Aktion ist ein POST Endpunkt mit einem generierten Pfad. Seine Fehler folgen den gleichen Regeln:
| Situation | Status | Kunde |
|---|---|---|
| Ein Feld fehlt oder ist ungültig | 422 |
ActionError mit fields |
HTTPException(403) in der Klage erhoben |
403 |
ActionError mit status und detail |
| eine unbehandelte Ausnahme | 500 |
ActionError; Die Referenz befindet sich im Serverprotokoll |
Der Origin-Header ist eine andere Site |
403 |
abgelehnt, bevor die Aktion ausgeführt wird |
Ein Formular ohne JavaScript Beiträge zum Aktionspfad; Bei Erfolg wird 303 auf die Seite zurückgeleitet, bei Fehler wird die Fehlerseite angezeigt. Siehe Aktionen.
Eine Checkliste, wenn eine Seite die falsche Antwort gibt
- Sehen Sie sich den Status an, nicht die Seite. Ein Brauch
notfound.nexyantwortet immer noch404. - Lesen Sie das Terminal. Eine Seite, deren Import fehlschlägt, ist nicht registriert, daher antwortet ihre URL
404, solange die Datei vorhanden ist. Der Importfehler steht im Protokoll. - Überprüfen Sie die Erweiterung. Mit
useCSR = Truegehören.nexySeiten zum Servermodus; Eine Seite im falschen Modus ist keine Route. - Überprüfen Sie die Tiefe. Ein
notfound.nexyodererrors.nexyfunktioniert nur, wenn die Root-Kopie vorhanden ist. - Fragen Sie nach JSON mit
Accept: application/json, um die Form zu sehen, die Ihr API-Client erhält. - Geben Sie die Referenz eines
500an, wenn Sie ein Problem öffnen oder das Protokoll durchsuchen.
Nächste Schritte
- Fehlerseiten: das vollständige Seitenverhalten mit Beispielen
- Validierung und Fehler: API-Handler
- Fehlerbehebung: Die Fehler, auf die die Leute tatsächlich stoßen
- Testen: Stellen Sie einen Status und einen Körper sicher