Understanding HTTP 422 Errors 🧐
The HTTP 422 Unprocessable Entity status code indicates that the server understands the request entity, but is unable to process the contained instructions. This is often due to validation errors. Let's explore how to leverage this effectively in Python 3.14+.
Advanced Schema Definitions with Pydantic 🚀
Pydantic is a powerful library for data validation using type annotations. It allows you to define schemas and automatically validate incoming data.
Example: Defining a User Schema
from pydantic import BaseModel, validator
from typing import Optional
class User(BaseModel):
user_id: int
name: str
email: str
age: Optional[int] = None
@validator('email')
def email_must_contain_at(cls, v):
if '@' not in v:
raise ValueError('Email must contain an @ symbol')
return v
@validator('age')
def age_must_be_positive(cls, v):
if v is not None and v <= 0:
raise ValueError('Age must be a positive number')
return v
Handling 422 Errors in FastAPI 🌐
FastAPI automatically uses Pydantic for data validation and returns HTTP 422 errors when validation fails.
Example: FastAPI Endpoint with Validation
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, validator
from typing import Optional
app = FastAPI()
class User(BaseModel):
user_id: int
name: str
email: str
age: Optional[int] = None
@validator('email')
def email_must_contain_at(cls, v):
if '@' not in v:
raise ValueError('Email must contain an @ symbol')
return v
@validator('age')
def age_must_be_positive(cls, v):
if v is not None and v <= 0:
raise ValueError('Age must be a positive number')
return v
@app.post("/users/")
async def create_user(user: User):
return user
Error Handling Example
from fastapi import FastAPI, Request, status
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
app = FastAPI()
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
return JSONResponse(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
content=jsonable_encoder({"detail": exc.errors(), "body": exc.body}),
)
Custom Error Responses 💬
You can customize the error responses to provide more informative feedback to the client.
Example: Custom Error Response
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
if item_id > 1000:
raise HTTPException(status_code=422, detail="Item ID exceeds maximum allowed value")
return {"item_id": item_id}
Summary of Key Points 🔑
- ✅ Use Pydantic for defining data schemas.
- 🚀 FastAPI automatically handles 422 errors based on Pydantic schemas.
- 💬 Customize error responses for better client feedback.
- 🛡️ Implement exception handlers for validation errors.