Custom request validation helps you check if the data sent to your API is correct and safe before using it.
Custom request validation in FastAPI
from fastapi import FastAPI, HTTPException from pydantic import BaseModel, validator class Item(BaseModel): name: str price: float @validator('price') def price_must_be_positive(cls, v): if v <= 0: raise ValueError('Price must be positive') return v app = FastAPI() @app.post('/items/') async def create_item(item: Item): return item
Use @validator decorator inside Pydantic models to add custom checks.
Raise ValueError with a message to show validation errors.
from pydantic import BaseModel, validator class User(BaseModel): username: str age: int @validator('age') def age_must_be_adult(cls, v): if v < 18: raise ValueError('User must be at least 18 years old') return v
@root_validator to check a rule involving multiple fields together.from pydantic import BaseModel, root_validator class Order(BaseModel): quantity: int price_per_item: float @root_validator def check_total_price(cls, values): quantity = values.get('quantity') price = values.get('price_per_item') if quantity is not None and price is not None and quantity * price > 1000: raise ValueError('Total price must not exceed 1000') return values
This FastAPI app defines a Product model with a custom validator to ensure the price is positive. When you send a POST request to /products/ with product data, it checks the price. If the price is zero or negative, it returns an error. Otherwise, it confirms creation.
from fastapi import FastAPI, HTTPException from pydantic import BaseModel, validator class Product(BaseModel): name: str price: float @validator('price') def price_must_be_positive(cls, v): if v <= 0: raise ValueError('Price must be positive') return v app = FastAPI() @app.post('/products/') async def create_product(product: Product): return {'message': f'Product {product.name} with price {product.price} created successfully'}
Custom validators run automatically when FastAPI parses the request body.
Validation errors return clear HTTP 422 responses with details.
You can use @root_validator to check multiple fields at once.
Custom request validation helps keep your API data clean and safe.
Use Pydantic validators inside your data models for easy checks.
FastAPI automatically handles validation errors and responses.
Practice
Solution
Step 1: Understand the role of validation
Validation ensures data meets expected rules before using it.Step 2: Identify FastAPI's validation purpose
FastAPI uses validation to keep data clean and safe, preventing bad data.Final Answer:
To check and enforce rules on incoming data before processing -> Option CQuick Check:
Validation = Data rules check [OK]
- Confusing validation with performance optimization
- Thinking validation manages database connections
- Mixing validation with documentation generation
Solution
Step 1: Recall Pydantic validation method
Pydantic uses @validator decorator inside model classes for custom checks.Step 2: Check other options
Overriding __init__ or external validate() methods are not standard; @app.validator does not exist.Final Answer:
Use @validator decorator inside the model class -> Option BQuick Check:
@validator = Custom check inside model [OK]
- Trying to override __init__ for validation
- Using decorators outside the model class
- Confusing FastAPI app decorators with Pydantic validators
from pydantic import BaseModel, validator
class User(BaseModel):
age: int
@validator('age')
def age_must_be_positive(cls, v):
if v <= 0:
raise ValueError('Age must be positive')
return v
What happens if a request sends
{"age": -5} to a FastAPI endpoint using this model?Solution
Step 1: Understand the validator logic
The validator raises ValueError if age is not positive.Step 2: Know FastAPI's error handling
FastAPI catches validation errors and returns a 422 response with details.Final Answer:
FastAPI returns a 422 error with validation details -> Option DQuick Check:
Invalid data triggers 422 error [OK]
- Assuming server crashes on validation error
- Thinking FastAPI accepts invalid data silently
- Confusing 422 with 500 server error
from pydantic import BaseModel, validator
class Item(BaseModel):
price: float
@validator('price')
def check_price(cls, value):
if value < 0:
return ValueError('Price must be non-negative')
return value
Solution
Step 1: Check validator error handling
Validators must raise exceptions, not return them.Step 2: Verify other parts
Validator is correctly a classmethod; price type float is valid; no naming rule requires 'validate_' prefix.Final Answer:
The validator should raise ValueError, not return it -> Option AQuick Check:
Raise errors in validators, don't return [OK]
- Returning exceptions instead of raising
- Confusing @validator with staticmethod
- Changing field types unnecessarily
Solution
Step 1: Understand the validation requirement
We need to ensure exactly one of two fields is present, a cross-field check.Step 2: Choose validation method
root_validator runs after all fields are parsed and can check multiple fields together.Step 3: Evaluate other options
Field validators cannot check other fields; dependency validation is after parsing; making both required contradicts the rule.Final Answer:
Use a root_validator to check that exactly one of email or phone is provided -> Option AQuick Check:
Cross-field checks use root_validator [OK]
- Trying to check multiple fields in single field validators
- Relying on FastAPI dependencies for core validation
- Making both fields required when only one should be
Ready to prove it?
Pass the test and this pattern moves unknown
