DokumentasiPenangan dan kesalahan
Halaman kesalahan
Permintaan yang gagal harus tetap menjawab seperti situs Anda lainnya: halaman dengan kata-kata Anda sendiri untuk pengunjung, kegagalan yang sama seperti JSON untuk klien API. Nexy menjawab keduanya, dan satu file menggantikan setiap jawaban.
Halaman ini adalah petanya: file mana yang menjawab status apa, dan bagaimana membuat status pertama Anda. Halaman-halaman folder mendapatkan halamannya sendiri.
Satu kegagalan, dua jawaban
a request that fails
│
├── a browser (Accept: text/html) ──► an HTML page
└── an API client (Accept: application/json) ──► {"detail": "…"} with the same status
the HTML page
├── the deepest folder of the URL that holds a file ──► your file
└── no folder of the chain holds one ──► the built-in pageHalaman pertama Anda
Buat src/routes/notfound.nexy dan tulis apa yang harus dibaca pengunjung:
metadata = {"title": "Page not found"}<h1>Page not found</h1><p>The page moved or never existed. <a href="/">Back home</a>.</p>Simpan, dan minta URL tidak ada yang berfungsi:
curl -i -H "Accept: text/html" http://localhost:3000/nowhere# HTTP/1.1 404 Not Found
File di root rute menjawab keseluruhan proyek; salinan dalam folder hanya menjawab folder itu dan menyimpan sisanya sebagaimana adanya. Tanpa file apa pun, Nexy menyajikan halaman bergaya bawaannya.
File mana yang menjawab
| Mengajukan | Jawaban |
|---|---|
notfound.nexy |
404 untuk direktorinya |
errors.nexy |
500 untuk direktorinya |
forbidden.nexy |
403 untuk direktorinya |
unauthorized.nexy |
401 untuk direktorinya |
loading.nexy |
dilindungi undang-undang; belum ada efek runtime |
| Situasi | Jawaban |
|---|---|
| Tidak ada rute yang cocok | 404 |
| Segmen dinamis tidak dapat dikonversi ke anotasinya | 404 |
| Pengecualian yang tidak tertangani, di halaman atau pengendali API | 500 |
raise HTTPException(status_code=403) |
status yang Anda naikkan, sebagai HTML atau JSON |
notFound(), forbidden(), unauthorized() |
404, 403, 401, dari mana saja dalam permintaan |
redirect(), permanentRedirect() |
pengalihan nyata tanpa halaman kesalahan |
Tinggalkan halaman atau jawaban dari kode
redirect, permanentRedirect, notFound, forbidden dan unauthorized memunculkan pengecualian HTTP, sehingga panggilan yang sama berfungsi di halaman .nexy, penangan API, pengontrol modular, penjaga, dan dependencies.py. Mereka memiliki nama yang sama di klien (@nexy/client).
from nexy import notFound, redirect from src.posts import find slug: prop[str]post = find(slug)if post is None: notFound()if post.moved_to: redirect(post.moved_to)<h1>{{ post.title }}</h1>| Telepon | Jawaban |
|---|---|
redirect(url) |
307; redirect(url, status=303) mengubah POST menjadi GET setelah formulir |
permanentRedirect(url) |
308; browser dan mesin pencari mengingatnya |
notFound(detail=None) |
404: halaman notfound, atau JSON untuk klien API |
forbidden(detail=None) |
403: pengunjung dikenal tetapi mungkin tidak melihatnya |
unauthorized(detail=None, scheme=None) |
401; scheme="Bearer" menambahkan WWW-Authenticate |
Jawaban pengalihan dengan header Location dan tanpa halaman, juga ke klien API. Bangun tujuan dari nilai-nilai yang Anda percayai: redirect(request.query_params["next"]) mengarahkan pengunjung ke mana pun yang disebutkan dalam tautan. Tujuan dengan jeda baris ditolak.
Seorang penjaga melindungi seluruh folder:
from nexy import unauthorizedfrom nexy.http import Request def require_login(request: Request) -> None: if not request.session.get("user"): unauthorized(scheme="Bearer") dependencies = [require_login]HTML atau JSON
Pengecualian yang sama menjawab secara berbeda tergantung pada siapa yang bertanya:
- Browser (
Accept: text/html) mendapat halaman HTML. Detailnya lolos dari HTML, sehingga pesan yang dibuat dari masukan pengguna tidak dapat memasukkan markup. - Klien yang meminta JSON dan bukan halaman (
Accept: application/json) mendapat{"detail": "..."}dengan kode status yang sama.
from nexy.http import HTTPException async def GET(id: int): if id > 100: raise HTTPException(status_code=403, detail="Out of range") return {"id": id}curl -H "Accept: application/json" http://localhost:3000/api/items/500# {"detail":"Out of range"}
Pengecualian yang tidak tertangani
Pengecualian yang tidak ditangani apa pun dicatat satu kali, dengan pengecualian, dari mana asalnya dan kode di sekitarnya, dan dijawab sesuai dengan modenya.
nx dev |
nx start |
|
|---|---|---|
| Peramban | halaman dengan kesalahan, baris kode Anda yang memunculkannya, dan penelusuran balik lengkap | halaman 500 bawaan (atau errors.nexy) Anda dengan referensi |
| klien JSON | {"detail", "reference", "error"} |
{"detail", "reference"} |
| Catatan server | pengecualian dan baris kode Anda | pengecualian dan seluruh penelusuran balik, dengan referensi yang sama |
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}
Referensinya adalah delapan karakter, baru untuk setiap kegagalan. Pengunjung dapat mengutipnya, dan Anda menemukan penelusuran baliknya dengan mencari lognya. Baik pengecualian maupun kode tidak sampai ke pengunjung dalam produksi. errors.nexy khusus hanya menggantikan halaman; garis log tetap ada.
Kesalahan validasi
Header, parameter kueri, atau bidang isi yang hilang menjawab 422 dengan isi JSON FastAPI, untuk setiap klien. Lihat Validasi dan kesalahan.
Langkah selanjutnya
- Halaman kesalahan per folder: 404, 403 atau 401 milik Anda sendiri dalam satu folder
- Rute dinamis
- Rute API
- Pengujian