Flask Pydantic Spec

A library to make it easy to add OpenAPI documentation to your Flask app, and validate the requests using Pydantic.
This library began as a fork of Spectree, but as we made changes we thought other people might be interested in our approach.
Features
- Less boilerplate code, only annotations, no need for YAML ✨
- Generate API document with Redoc UI or Swagger UI 😋
- Validate query, JSON data, response data with pydantic 😉
- Has support for request/response types other than JSON.
Quick Start
install with pip: pip install flask-pydantic-spec
Examples
Check the examples folder.
Step by Step
- Define your data structure used in (query, json, headers, cookies, resp) with
pydantic.BaseModel - create
flask_pydantic_spec.Validatorinstance with the web framework name you are using, likeapi = Validator('flask') api.validatedecorate the route withquerybodyheaderscookiesresptags
- access this data with
context(query, body, headers, cookies)(of course, you can access these from the original place where the framework offered)- flask:
request.context
- flask:
- register to the web application
api.register(app) - check the document at URL location
/apidoc/redocor/apidoc/swagger
If the request doesn't pass the validation, it will return a 422 with JSON error message(ctx, loc, msg, type).
How To
How to add summary and description to endpoints?
Just add docs to the endpoint function. The 1st line is the summary, and the rest is the description for this endpoint.
How to add description to parameters?
Check the pydantic docs about description in Field.
Any config I can change?
Of course. Check the config document.
You can update the config when you init the validator like:
from flask_pydantic_spec import FlaskPydanticSpec
FlaskPydanticSpec("flask", title="Demo API", version="v1.0", path="doc")
What is a
Responseand how to use it?
To build a response for the endpoint, you need to declare the status code with format HTTP_{code} and corresponding data (optional).
from flask_pydantic_spec import Response
Response(HTTP_200=None, HTTP_403=ForbidModel)
Response('HTTP_200') # equals to Response(HTTP_200=None)
What should I return when I'm using the library?
No need to change anything. Just return what the framework required.
How to logging when the validation failed?
Validation errors are logged with INFO level. Details are passed into extra.
How can I change the response when there is a validation error? Can I record some metrics?
This library provides before and after hooks to do these. Check the doc or the test case. You can change the handlers for Flask-Pydantic-Spec or for a specific endpoint validation.
Demo
Try it with http post :8000/api/user name=alice age=18. (if you are using httpie)
Flask
from flask import Flask, request, jsonify
from pydantic import BaseModel, Field, constr
from flask_pydantic_spec import FlaskPydanticSpec, Response, Request
class Profile(BaseModel):
name: constr(min_length=2, max_length=40) # Constrained Str
age: int = Field(
...,
gt=0,
lt=150,
description='user age(Human)'
)
class Config:
schema_extra = {
# provide an example
'example': {
'name': 'very_important_user',
'age': 42,
}
}
class Message(BaseModel):
text: str
app = Flask(__name__)
api = FlaskPydanticSpec('flask')
@app.route('/api/user', methods=['POST'])
@api.validate(body=Request(Profile), resp=Response(HTTP_200=Message, HTTP_403=None), tags=['api'])
def user_profile():
"""
verify user profile (summary of this endpoint)
user's name, user's age, ... (long description)
"""
print(request.context.json) # or `request.json`
return jsonify(text='it works')
if __name__ == "__main__":
api.register(app) # if you don't register in api init step
app.run(port=8000)
FAQ
ValidationError: missing field for headers
The HTTP headers' keys in Flask are capitalized.
You can use pydantic.root_validators(pre=True) to change all the keys into lower cases or upper cases.
ValidationError: value is not a valid list for query
Since there is no standard for HTTP query with multiple values, it's hard to find the way to handle this for different web frameworks. So I suggest not to use list type in query until I find a suitable way to fix it.
Metadata
Release files for flask-pydantic-spec 0.8.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| flask_pydantic_spec-0.8.7.tar.gz | 28.0 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| flask_pydantic_spec-0.8.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 51.4 kB
Release files / flask_pydantic_spec-0.8.7.tar.gz
| Download URL | flask_pydantic_spec-0.8.7.tar.gz |
|---|---|
| Size | 28.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d51cf7dec35c94cb98ee56a115e129e85dc1f4f43efeaa076dc1f8feae5ab502
|
|
BLAKE2b-256 checksum How to use checksums |
48a16878d14882715a0d0d2fce04e754e0f9c69254eaad3a001f786cf85803c2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 25, 2025.
Transparency logRelease files / flask_pydantic_spec-0.8.7-py3-none-any.whl
| Download URL | flask_pydantic_spec-0.8.7-py3-none-any.whl |
|---|---|
| Size | 23.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
948be031152d4be79f9cc9c93931e0c22adf78b996adbe73c4b4c3af12dcbff2
|
|
BLAKE2b-256 checksum How to use checksums |
488de41ee7e758f8df02fbc6eec290884bca283d158abc14810d92a76b716ee0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 25, 2025.
Transparency logSecurity for flask-pydantic-spec 0.8.7
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for flask_pydantic_spec-0.8.7.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 25, 2025.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.