DokumentasiPython API dan kesalahan
Pengecualian dan kesalahan
Sebuah permintaan bisa gagal di empat tempat, dan Nexy menjawab masing-masing permintaan secara berbeda. Halaman ini adalah indeksnya: temukan status yang Anda lihat, lalu baris yang menghasilkannya, lalu file yang menentukan isi.
Versi pendek
| Apa yang terjadi | Status | Peramban melihat | Klien API melihat |
|---|---|---|---|
| tidak ada rute yang cocok dengan URL | 404 |
notfound.nexy, jika tidak, halaman bawaan |
{"detail": "Not Found"} |
| segmen jalur tidak sesuai dengan anotasinya | 404 |
halaman yang sama | {"detail": "Not Found"} |
| bidang kueri, header, cookie, atau isi tidak ada atau tidak valid | 422 |
FastAPI badan JSON | FastAPI badan JSON |
notFound() |
404 |
halaman | {"detail": ...} |
unauthorized() |
401 |
halaman bawaan | {"detail": ...} |
forbidden() |
403 |
halaman bawaan | {"detail": ...} |
raise HTTPException(409, ...) |
409 |
halaman bawaan | {"detail": ...} |
| pengecualian tidak ada yang tertangkap | 500 |
errors.nexy, jika tidak, halaman bawaan |
{"detail", "reference"} |
redirect(url) |
307 |
tujuan, tidak ada halaman | tujuannya, tidak ada tubuh |
permanentRedirect(url) |
308 |
tujuan, tidak ada halaman | tujuan |
Klien API adalah permintaan yang header Accept-nya meminta JSON dan bukan halaman:
curl -H "Accept: application/json" http://localhost:3000/api/items/500# {"detail":"Out of range"}
Dari mana sebuah kegagalan berasal
Browser ──► Middleware ──► Router ──► Page or handler
│ │ │
│ │ ├─ return ───────────► 200
│ │ ├─ HTTPException ────► its status
│ │ └─ other exception ───► 500
│ └─ no match ────────────────────────► 404
└─ raises ──────────────────────────────────────► 500| Panggung | Apa yang bisa gagal | Jawabannya |
|---|---|---|
| Perangkat Tengah | middleware.py, CORS, sesi Anda |
status pengecualian, yang lain 500 |
| Perute | URL tidak cocok dengan file | 404 |
| Validasi | segmen jalur tidak dapat dikonversi | 404 |
| Validasi | bidang kueri, header, cookie, atau isi | 422 |
| Halaman, pawang, aksi, penjaga | HTTPException |
statusnya |
| Halaman, pawang, aksi, penjaga | hal lain | 500 |
Berangkat dari mana saja
redirect, permanentRedirect, notFound, forbidden dan unauthorized memunculkan pengecualian HTTP, sehingga panggilan yang sama berfungsi di halaman .nexy, penangan API, pengontrol modular, penjaga, dependencies.py dan tindakan.
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 postCantumkan pengontrol di controllers modul root.
| Telepon | Jawaban | Kapan |
|---|---|---|
notFound(detail=None) |
404 |
sumber dayanya tidak ada |
unauthorized(detail=None, scheme=None) |
401 |
pengunjung harus login terlebih dahulu |
forbidden(detail=None) |
403 |
pengunjung diketahui tetapi mungkin tidak melihatnya |
redirect(url, status=307) |
307 |
kirim mereka ke tempat lain, pertahankan metodenya |
redirect(url, status=303) |
303 |
setelah formulir: permintaan berikutnya adalah GET |
permanentRedirect(url) |
308 |
halaman dipindahkan yang harus diingat oleh mesin pencari |
Bangun tujuan dari nilai-nilai yang Anda percayai. redirect(request.query_params["next"]) mengarahkan pengunjung ke mana pun yang disebutkan dalam tautan; ini adalah pengalihan terbuka. Tujuan yang memiliki jeda baris ditolak.
Validasi: 422, atau 404
Parameter handler divalidasi oleh FastAPI berdasarkan anotasinya.
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}Cantumkan pengontrol di controllers modul root.
| Masalah | Status | Mengapa |
|---|---|---|
| bidang kueri, header, cookie, atau isi tidak ada atau tidak valid | 422 |
permintaan sampai ke handler, datanya salah |
segmen jalur tidak valid (/api/users/abc untuk id: int) |
404 |
folder tersebut tidak memiliki rute untuk non-angka, jadi URL-nya tidak ada |
Isi 422 adalah bentuk standar FastAPI, sehingga klien dan SDK yang dihasilkan tetap berfungsi:
{"detail": [{"loc": ["query", "q"], "msg": "Field required", "type": "missing"}]}
Untuk formulir atau tindakan, klien menerima ActionError dengan status dan detail; a 422 juga mengisi error.fields dengan satu pesan per kolom. Lihat Tindakan.
Halaman kesalahan khusus
<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>| Mengajukan | Status | Ruang lingkup |
|---|---|---|
src/routes/notfound.nexy |
404 |
setiap rute proyek |
src/routes/errors.nexy |
500 |
setiap rute proyek |
src/routes/forbidden.nexy |
403 |
setiap rute proyek |
src/routes/unauthorized.nexy |
401 |
setiap rute proyek |
src/routes/blog/notfound.nexy |
404 |
/blog dan di bawahnya |
src/routes/blog/errors.nexy |
500 |
/blog dan di bawahnya |
src/routes/loading.nexy |
- | sudah dipesan, belum ada efek runtime |
Satu file di suatu tempat di rute menginstal jawaban untuk statusnya: salinan di root menjawab keseluruhan proyek, salinan di folder menjawab folder itu, dan file terdalam yang cocok dengan URL menang. URL di luar setiap salinan, dan status tanpa file sama sekali, mendapatkan halaman bergaya bawaan. Lihat Halaman kesalahan per folder.
Router modular tidak memiliki halaman kesalahan dalam file: 404, 500, 403 atau 401 mendapatkan halaman gaya bawaan. Halaman kesalahan per folder adalah konvensi router berbasis file.
Pengecualian yang tidak tertangani
Pengecualian bahwa tidak ada yang tertangkap dicatat satu kali, dengan referensinya, dari mana asalnya, dan kode di sekitarnya. Statusnya adalah 500, dan tubuhnya bergantung pada lingkungan.
nexy dev |
nexy build lalu nexy start |
|
|---|---|---|
| Peramban | kesalahan, baris kode Anda, dan penelusuran balik | errors.nexy, jika tidak, halaman bawaan, dengan referensi |
| klien API | {"detail", "reference", "error"} |
{"detail", "reference"} |
| Terminal | pengecualian dan baris kode Anda | pengecualian, keseluruhan penelusuran balik, dan referensi |
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.
Tindakan dan bentuk
Suatu tindakan adalah titik akhir POST dengan jalur yang dihasilkan. Kegagalannya mengikuti aturan yang sama:
| Situasi | Status | Klien |
|---|---|---|
| ada bidang yang hilang atau tidak valid | 422 |
ActionError dengan fields |
HTTPException(403) diangkat dalam aksi |
403 |
ActionError dengan status dan detail |
| pengecualian yang tidak tertangani | 500 |
ActionError; referensinya ada di log server |
header Origin adalah situs lain |
403 |
menolak sebelum aksi berjalan |
Formulir tanpa JavaScript memposting ke jalur tindakan; jika berhasil menjawab 303 kembali ke halaman, jika gagal menampilkan halaman kesalahan. Lihat Tindakan.
Daftar periksa ketika suatu halaman menjawab hal yang salah
- Lihat statusnya, bukan halamannya. Sebuah kebiasaan
notfound.nexymasih menjawab404. - Baca terminal. Halaman yang gagal diimpor tidak terdaftar, jadi URL-nya menjawab
404selagi file ada. Kesalahan impor ada di log. - Periksa ekstensinya. Dengan
useCSR = True,.nexyhalaman termasuk dalam mode server; halaman dalam mode yang salah bukanlah rute. - Periksa kedalamannya.
notfound.nexyatauerrors.nexyhanya berfungsi jika salinan root ada. - Minta JSON dengan
Accept: application/jsonuntuk melihat bentuk yang diterima klien API Anda. - Kutip referensi dari
500ketika Anda membuka terbitan atau mencari log.
Langkah selanjutnya
- Halaman kesalahan: perilaku halaman penuh, dengan contoh
- Validasi dan kesalahan: penangan API
- Pemecahan masalah: kesalahan yang sebenarnya terjadi
- Pengujian: menegaskan status dan isi