pythonasyncioapiasyncfastapiframeworkjsonjson-schemaopenapiopenapi3pydanticpython-typespython3redocreststarletteswaggerswagger-uiuvicornweb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1.2 KiB
37 lines
1.2 KiB
from fastapi import FastAPI, HTTPException, Request
|
|
from fastapi.encoders import jsonable_encoder
|
|
from fastapi.exceptions import RequestValidationError
|
|
from fastapi.responses import JSONResponse
|
|
from starlette import status
|
|
from starlette.exceptions import HTTPException as StarletteHTTPException
|
|
|
|
app = FastAPI()
|
|
|
|
|
|
@app.exception_handler(StarletteHTTPException)
|
|
async def http_exception_handler(request: Request, exc: StarletteHTTPException):
|
|
"""
|
|
Handles all HTTPException (Starlette) errors.
|
|
Returns a JSON response with status code and detail.
|
|
"""
|
|
return JSONResponse(status_code=exc.status_code, content={"message": exc.detail})
|
|
|
|
|
|
@app.exception_handler(RequestValidationError)
|
|
async def validation_exception_handler(request: Request, exc: RequestValidationError):
|
|
"""
|
|
Handles validation errors for request data.
|
|
Returns a JSON response with 400 status and error details.
|
|
"""
|
|
return JSONResponse(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
content=jsonable_encoder({"errors": exc.errors(), "body": exc.body}),
|
|
)
|
|
|
|
|
|
@app.get("/items/{item_id}")
|
|
async def read_item(item_id: int):
|
|
|
|
if item_id == 3:
|
|
raise HTTPException(status_code=418, detail="Nope! I don't like 3.")
|
|
return {"item_id": item_id}
|
|
|