Flask Pydantic Spec

0.8.7 · active · verified Thu Apr 16

Flask Pydantic Spec is a Python library that simplifies the generation of OpenAPI documentation and the validation of Flask request/response payloads using Pydantic models and Python annotations. It provides decorators to integrate Pydantic validation directly into Flask route functions, enhancing API reliability and maintainability. The library is actively maintained, with frequent minor releases, and the current version is 0.8.7.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to create a Flask application with `flask-pydantic-spec` to validate incoming query parameters and serialize outgoing JSON responses. It defines Pydantic models for the request's query and the response body. The `@spec.validate` decorator applies the validation rules, and validated data is accessible via `spec.query` or `spec.body` within the route function.

from flask import Flask
from flask_pydantic_spec import FlaskPydanticSpec, Request, Response, Query
from pydantic import BaseModel, Field

# Define Pydantic models for request and response
class UserRequest(Request):
    user_id: int = Field(Query, description="ID of the user")

class UserResponse(BaseModel):
    id: int
    name: str
    email: str

app = Flask(__name__)
spec = FlaskPydanticSpec('flask-pydantic-spec', app=app)
spec.register(app)

@app.route('/user/<int:user_id>')
@spec.validate(
    query=UserRequest,
    resp=Response(HTTP_200=UserResponse)
)
def get_user(user_id):
    # Access validated query parameters via spec.query
    # Note: user_id from path param will override if name conflict
    if spec.query.user_id != user_id:
        print(f"Warning: Path ID {user_id} and Query ID {spec.query.user_id} mismatch.")

    # In a real app, fetch user from DB
    user_data = {"id": user_id, "name": f"User_{user_id}", "email": f"user{user_id}@example.com"}
    return UserResponse(**user_data).model_dump()

# Example of OpenAPI documentation endpoint (auto-generated)
# Accessible at /swagger or /redoc by default

if __name__ == '__main__':
    app.run(debug=True)

view raw JSON →