Pendahuluan
Dalam artikel ini, saya akan memperkenalkan bagaimana cara menyesuaikan kesalahan default 422 di FastAPI, yang umumnya menunjukkan kesalahan validasi dalam permintaan klien. Kita akan menjelaskan dua tugas utama: mengganti penanganan kesalahan default untuk RequestValidationError
dan mengubah dokumen OpenAPI untuk menghapus respons kesalahan 422 default dari dokumen tersebut.
Menyesuaikan Kesalahan Default 422 di FastAPI
Kita akan menjelaskan proses menyesuaikan kesalahan default 422 di FastAPI. Ini melibatkan mengganti penanganan kesalahan default untuk RequestValidationError
dan membuat respons kesalahan validasi kustom.
Mengganti Penanganan Kesalahan Default
Untuk mengganti penanganan kesalahan default untuk RequestValidationError
, ikuti langkah-langkah berikut:
- Impor modul yang diperlukan dan buat instance aplikasi FastAPI baru:
async def custom_request_validation_exception_handler(request: Request, exc: RequestValidationError):
return JSONResponse(
status_code=422,
content={
"error_code": "CUSTOM_VALIDATION_ERROR",
"message": "One or more request parameters failed validation",
"detail": exc.errors(),
},
)
- Tentukan fungsi penanganan kesalahan kustom. Fungsi ini harus menerima objek
Request
dan pengecualianRequestValidationError
yang diangkat. Fungsi ini harus mengembalikan respons kustom, sepertiJSONResponse
:
async def custom_request_validation_exception_handler(request: Request, exc: RequestValidationError):
return JSONResponse(
status_code=422,
content={
"error_code": "CUSTOM_VALIDATION_ERROR",
"message": "One or more request parameters failed validation",
"detail": exc.errors(),
},
)
- Daftarkan penanganan kesalahan kustom dengan instance aplikasi FastAPI:
app.exception_handler(RequestValidationError)(custom_request_validation_exception_handler)
Membuat Respons Kesalahan Validasi Kustom
Untuk membuat respons kesalahan validasi kustom, ikuti langkah-langkah berikut:
- Tentukan model respons kustom menggunakan Pydantic. Model ini harus mencakup bidang-bidang yang ingin Anda kembalikan dalam respons kesalahan kustom:
from pydantic import BaseModel
class CustomValidationError(BaseModel):
error_code: str
message: str
detail: List[Dict[str, Any]]
- Perbarui fungsi penanganan kesalahan kustom untuk menggunakan model respons kustom:
async def custom_request_validation_exception_handler(request: Request, exc: RequestValidationError):
custom_error = CustomValidationError(
error_code="CUSTOM_VALIDATION_ERROR",
message="One or more request parameters failed validation",
detail=exc.errors(),
)
return JSONResponse(status_code=422, content=custom_error.dict())
Dengan mengikuti langkah-langkah ini, Anda berhasil menyesuaikan kesalahan default 422 di FastAPI. Respons kesalahan kustom sekarang akan dikembalikan setiap kali terjadi RequestValidationError
.
Menghapus Kesalahan Default 422 dari Dokumen OpenAPI
FastAPI secara otomatis menghasilkan dokumen OpenAPI untuk API Anda, yang mencakup informasi tentang respons yang mungkin dari endpoint-endpoint Anda. Secara default, dokumen OpenAPI mencakup respons kesalahan 422 untuk semua endpoint, yang menunjukkan kemungkinan kesalahan validasi.
Dalam beberapa kasus, Anda mungkin ingin menghapus kesalahan default 422 ini dari dokumen OpenAPI. Ini dapat dilakukan dengan menyesuaikan metode app.openapi()
. Berikut adalah langkah-langkah untuk melakukannya:
- Setelah mendefinisikan instance aplikasi FastAPI, Anda perlu mengganti metode
app.openapi()
:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
def custom_openapi():
if app.openapi_schema:
return app.openapi_schema
openapi_schema = get_openapi(
title="Custom schema",
version="2.5.0",
description="This is a very custom OpenAPI schema",
routes=app.routes,
)
openapi_schema["paths"].pop("/openapi.json")
app.openapi_schema = openapi_schema
return app.openapi_schema
app.openapi = custom_openapi
Pada kode di atas, fungsi custom_openapi()
mengambil skema OpenAPI yang ada jika sudah ada, dan jika tidak ada, maka akan menghasilkan skema baru. Baris openapi_schema["paths"].pop("/openapi.json")
menghapus rute JSON OpenAPI dari skema.
- Ubah fungsi
custom_openapi()
untuk menghapus kesalahan default 422 dari skema OpenAPI:
def custom_openapi():
if app.openapi_schema:
return app.openapi_schema
openapi_schema = get_openapi(
title="Custom schema",
version="2.5.0",
description="This is a very custom OpenAPI schema",
routes=app.routes,
)
for path, path_dict in openapi_schema["paths"].items():
for method, method_dict in path_dict.items():
method_dict.pop("responses", {}).pop("422", None)
app.openapi_schema = openapi_schema
return app.openapi_schema
Fungsi custom_openapi()
yang diperbarui sekarang mengulang semua path dan metode dalam skema OpenAPI dan menghapus respons 422 jika ada.