Read this in: 한국어 | 日本語 | 简体中文
Validation and serialization for the Azure Functions Python v2 programming model.
Part of the Azure Functions Python DX Toolkit → Bring FastAPI-like developer experience to Azure Functions
Azure Functions Python v2 handlers often drift into the same repeated problems:
- Repeated manual parsing — every handler calls
req.get_json(),req.params.get(), handlesValueErrorindividually - Inconsistent error responses — some handlers return 400, others 422, formats vary across the project
- Missing response contracts — response payloads silently diverge from the intended schema
- No type safety — request data flows through as untyped dicts, bugs surface only at runtime
- Typed validation — body, query, path, and header parameters validated via Pydantic v2
- Automatic error responses — invalid requests get consistent
400/422JSON error bodies - Response model enforcement — mismatches raise
ResponseValidationError(HTTP 500) - Decorator-first API —
@validate_httpwraps your handler, no boilerplate needed
| Feature | FastAPI | azure-functions-validation |
|---|---|---|
| Request body parsing | Built-in via type hints | @validate_http(body=Model) |
| Query/path/header validation | Query(), Path(), Header() |
@validate_http(query=Model, path=Model, headers=Model) |
| Response model | response_model= |
@validate_http(response_model=Model) |
| Validation errors | Automatic 422 | Automatic 422 with {"detail": [...]} |
| Error customization | Exception handlers | ErrorFormatter callback |
- Azure Functions Python v2 programming model
- HTTP-triggered functions registered on
func.FunctionApp() - Pydantic v2-based request and response validation
This package does not target the legacy function.json-based v1 programming model.
This package does not own:
- API documentation and spec generation — use
azure-functions-openapi - Runtime exposure or graph deployment — use
azure-functions-langgraph - Project scaffolding — use
azure-functions-scaffold
- Typed body, query, path, and header validation via
@validate_http - Automatic 400 / 422 responses with
{"detail": [...]}envelope - Response model validation — mismatches raise
ResponseValidationError(HTTP 500) - Custom per-handler error formatting via
ErrorFormatter
pip install azure-functions-validationYour Azure Functions app should also include:
azure-functions
azure-functions-validation
For local development:
git clone https://github.com/yeongseon/azure-functions-validation.git
cd azure-functions-validation
pip install -e .[dev]import azure.functions as func
from pydantic import BaseModel
from azure_functions_validation import validate_http
class CreateUserRequest(BaseModel):
name: str
email: str
class CreateUserResponse(BaseModel):
message: str
status: str = "success"
app = func.FunctionApp()
@app.function_name(name="create_user")
@app.route(route="users", methods=["POST"], auth_level=func.AuthLevel.ANONYMOUS)
@validate_http(body=CreateUserRequest, response_model=CreateUserResponse)
def create_user(req: func.HttpRequest, body: CreateUserRequest) -> CreateUserResponse:
return CreateUserResponse(message=f"Hello {body.name}")Start the Functions host locally:
func startAfter deploying (see docs/deployment.md), the same request produces the same response in both environments.
curl -s http://localhost:7071/api/users \
-H "Content-Type: application/json" \
-d '{"name": "Alice", "email": "alice@example.com"}'{"message": "Hello Alice", "status": "success"}curl -s "https://<your-app>.azurewebsites.net/api/users" \
-H "Content-Type: application/json" \
-d '{"name": "Alice", "email": "alice@example.com"}'{"message": "Hello Alice", "status": "success"}Invalid requests return the same 400 error in both environments:
curl -s http://localhost:7071/api/users \
-H "Content-Type: application/json" \
-d 'not json'{"detail": [{"loc": [], "msg": "Invalid JSON", "type": "value_error"}]}HTTP 400
curl -s "https://<your-app>.azurewebsites.net/api/users" \
-H "Content-Type: application/json" \
-d 'not json'{"detail": [{"loc": [], "msg": "Invalid JSON", "type": "value_error"}]}HTTP 400
Verified against a temporary Azure Functions deployment in koreacentral (Python 3.12, Consumption plan). Response captured and URL anonymized.
- You have HTTP-triggered Azure Functions that accept JSON request bodies
- You want Pydantic-based validation without writing manual parsing code
- You need consistent error response formats across handlers
- You want response schema enforcement to catch contract drift
- Project docs live under
docs/ - Smoke-tested examples live under
examples/ - Product requirements:
PRD.md - Design principles:
DESIGN.md
This package is part of the Azure Functions Python DX Toolkit.
Design principle: azure-functions-validation owns request/response validation and serialization. azure-functions-openapi owns API documentation and spec generation. azure-functions-langgraph owns LangGraph runtime exposure.
| Package | Role |
|---|---|
| azure-functions-langgraph | LangGraph deployment adapter for Azure Functions |
| azure-functions-validation | Request/response validation and serialization |
| azure-functions-openapi | OpenAPI spec generation and Swagger UI |
| azure-functions-logging | Structured logging and observability |
| azure-functions-doctor | Pre-deploy diagnostic CLI |
| azure-functions-scaffold | Project scaffolding |
| azure-functions-durable-graph | Manifest-first graph runtime with Durable Functions |
| azure-functions-python-cookbook | Recipes and examples |
When integrating with LLM-powered coding assistants, provide these files for context:
llms.txt— Concise index with quick start and API overviewllms-full.txt— Expanded reference with full signatures and patterns
Reference the files at repository root:
- https://github.com/yeongseon/azure-functions-validation/blob/main/llms.txt
- https://github.com/yeongseon/azure-functions-validation/blob/main/llms-full.txt
This project is an independent community project and is not affiliated with, endorsed by, or maintained by Microsoft.
Azure and Azure Functions are trademarks of Microsoft Corporation.
MIT