Traffine I/O

Bahasa Indonesia

2022-07-06

Menyesuaikan Kesalahan Default 422 di FastAPI

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:

  1. Impor modul yang diperlukan dan buat instance aplikasi FastAPI baru:
python
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(),
        },
    )
  1. Tentukan fungsi penanganan kesalahan kustom. Fungsi ini harus menerima objek Request dan pengecualian RequestValidationError yang diangkat. Fungsi ini harus mengembalikan respons kustom, seperti JSONResponse:
python
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(),
        },
    )
  1. Daftarkan penanganan kesalahan kustom dengan instance aplikasi FastAPI:
python
app.exception_handler(RequestValidationError)(custom_request_validation_exception_handler)

Membuat Respons Kesalahan Validasi Kustom

Untuk membuat respons kesalahan validasi kustom, ikuti langkah-langkah berikut:

  1. Tentukan model respons kustom menggunakan Pydantic. Model ini harus mencakup bidang-bidang yang ingin Anda kembalikan dalam respons kesalahan kustom:
python
from pydantic import BaseModel

class CustomValidationError(BaseModel):
    error_code: str
    message: str
    detail: List[Dict[str, Any]]
  1. Perbarui fungsi penanganan kesalahan kustom untuk menggunakan model respons kustom:
python
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:

  1. Setelah mendefinisikan instance aplikasi FastAPI, Anda perlu mengganti metode app.openapi():
python
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.

  1. Ubah fungsi custom_openapi() untuk menghapus kesalahan default 422 dari skema OpenAPI:
python
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.

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!