Bagaimana untuk Menyesuaikan Respons Ralat FastAPI untuk Laluan Tertentu?

Mary-Kate Olsen
Lepaskan: 2024-11-20 00:35:02
asal
655 orang telah melayarinya

How to Customize FastAPI's Error Response for Specific Routes?

Sesuaikan Respons Ralat untuk Laluan Tertentu dalam FastAPI

Dalam FastAPI, apabila mengesahkan permintaan, jika parameter tiada atau tidak sah, FastAPI menimbulkan pengecualian RequestValidationError. Secara lalai, pengecualian ini mengembalikan respons 422 Entiti Tidak Boleh Diproses. Walau bagaimanapun, anda mungkin mahu menyesuaikan respons ini untuk laluan tertentu. Berikut ialah beberapa pendekatan untuk mencapai ini:

Pilihan 1: Gantikan Pengendali Pengecualian Lalai

Timpa pengendali pengecualian lalai untuk RequestValidationError dan berikan respons tersuai untuk yang dikehendaki laluan.

from fastapi import FastAPI, Request, status, HTTPException
from fastapi.responses import JSONResponse
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError

app = FastAPI()
routes_with_custom_exception = ['/']

@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    if request.url.path in routes_with_custom_exception:
        return JSONResponse(content={'401': 'Unauthorized'}, status_code=401)
Salin selepas log masuk

Pilihan 2: Gunakan Sub-Aplikasi

Buat sub-aplikasi dan lekapkannya pada apl utama untuk laluan tertentu. Gantikan pengendali pengecualian untuk RequestValidationError dalam sub-aplikasi.

from fastapi import FastAPI, RequestValidationError, HTTPException
from fastapi.responses import JSONResponse

app = FastAPI()
subapi = FastAPI()

@subapi.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    return 
JSONResponse(content={'401': 'Unauthorized'}, status_code=401)

app.mount('/sub', subapi)
Salin selepas log masuk

Pilihan 3: Gunakan Penghala API Tersuai dan APIRoute

Buat subkelas APIRoute tersuai dan ganti kaedah get_route_handler. Ini membolehkan anda memintas permintaan dan mengendalikan pengecualian RequestValidationError.

from fastapi import FastAPI
from fastapi.routing import APIRoute
from fastapi.responses import JSONResponse
from fastapi.exceptions import RequestValidationError
from fastapi.requests import Request

class ValidationErrorHandlingRoute(APIRoute):
    def get_route_handler(self):
        original_route_handler = super().get_route_handler()

        async def custom_route_handler(request: Request):
            try:
                return await original_route_handler(request)
            except RequestValidationError as e:
                return JSONResponse(content={'401': 'Unauthorized'}, status_code=401)

        return custom_route_handler

app = FastAPI()
router = APIRouter(route_class=ValidationErrorHandlingRoute)

@app.get('/')
async def main():
    return {'message': 'Hello from main API'}

@router.get('/custom')
async def custom_route(some_custom_header: str = Header(...)):
    return {'some-custom-header': some_custom_header}

app.include_router(router)
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menyesuaikan Respons Ralat FastAPI untuk Laluan Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan