Changelog¶
All notable changes to FastOpenAPI are documented in this file.
FastOpenAPI follows the Keep a Changelog format.
[1.0.0rc1] - 2026-03-11¶
Added¶
- Multi-body parameter support following FastAPI semantics: multiple body parameters are automatically embedded by name,
Body(embed=True)supported for single parameters
Fixed¶
- GET + Pydantic model now correctly reads query params instead of body at runtime
- Aiohttp multipart reader no longer consumed twice — form fields and files parsed in a single pass with caching
- Falcon async router binary/text responses now use proper content-type branching (was forcing
response.mediafor all) - Async DI resolver no longer holds
threading.Lockacrossawait— removed unnecessary lock since async is single-threaded per event loop - Tornado cookies now extracted as strings instead of
Morselobjects - 204 responses now preserve custom headers from tuple returns and
Responseobjects - OpenAPI schema invalidated after
add_route/include_router— no more stale schema if accessed before all routes are registered - JSON array in request body returns 422 instead of 500 when endpoint expects a single Pydantic model
- DI cache reliability improvements
- Error hierarchy backward compatibility fixes
[1.0.0b1] - 2026-02-09¶
Added¶
- Dependency Injection system with
DependsandSecurityfor automatic dependency resolution - Request-scoped caching (same dependency called multiple times returns cached result)
- Circular dependency detection
SecurityScopesinjection for OAuth2 scope validation- Generator/yield dependencies with proper cleanup (sync and async)
- FastAPI-style parameter classes:
Query,Path,Header,Cookie,Body,Form,File - Full Pydantic v2 validation:
gt,ge,lt,le,min_length,max_length,pattern,multiple_of,strict, etc. - Parameter metadata:
description,title,example,examples,deprecated - Alias support for headers and query parameters
- Django support with
DjangoRouter(sync) andDjangoAsyncRouter(async), includingurlsproperty for Django URL patterns - Falcon async support with
FalconAsyncRouter(in addition to existing syncFalconRouter) FileUploadclass for framework-agnostic file handling with.read()and.aread()methods- Form data and file upload extraction for all frameworks
RequestDataunified container for request data across all frameworksResponseclass for custom responses with headers and status codes- Response model validation via
TypeAdapterwith thread-safe caching - Standardized error hierarchy:
APIError,BadRequestError,ValidationError(422),AuthenticationError,AuthorizationError,ResourceNotFoundError,ResourceConflictError,InternalServerError,ServiceUnavailableError,DependencyError,CircularDependencyError,SecurityError APIError.from_exception()for converting any exception to standardized JSON formatEXCEPTION_MAPPERon routers for framework-specific exception conversion (e.g., Django'sPermissionDenied→AuthorizationError)- Built-in OpenAPI security schemes: Bearer JWT, API Key (header/query), Basic Auth, OAuth2
- Custom security schemes via
security_schemeparameter (acceptsSecuritySchemeTypeenum or raw dict) - Security scheme merging in
include_router() SecuritySchemeTypeexported fromfastopenapifor public use- Documentation completely rewritten with guides, API reference, framework-specific pages, and examples
Changed¶
- Complete architecture refactor from monolithic
base_router.pyto composition-based modular design: core/—BaseRouter, parameter classes, dependency resolver, types, constantsresolution/—ParameterResolver(extracted fromBaseRouter.resolve_endpoint_params())response/—ResponseBuilder(extracted fromBaseRouter._serialize_response())openapi/—OpenAPIGenerator,SchemaBuilder, UI renderers (extracted fromBaseRouter.generate_openapi())errors/— error hierarchy (extracted fromerror_handler.py)routers/—BaseAdapter+ per-framework packages with separate extractors- All framework routers now inherit from
BaseAdapterinstead ofBaseRouter - Each framework router split into separate router and extractor modules
- Route metadata stored in
RouteInfoclass (was tuple) - Validation errors now return HTTP 422 (was 400)
- OpenAPI
summaryresolved from route metadata or formatted endpoint name;descriptionfrom metadata or docstring - Improved import errors with
MissingRouterraisingImportErrorwhen framework is not installed djangoadded as optional dependency extra
Deprecated¶
- Importing from
fastopenapi.error_handlermodule (usefrom fastopenapi.errors import ...instead)
Removed¶
BaseRouter.generate_openapi()method (userouter.openapiproperty)BaseRouter.resolve_endpoint_params()andBaseRouter._serialize_response()internal methods- Multi-language documentation (single English version retained)
[0.7.0] - 2025-04-27¶
Changed¶
- Replaced
json.dumps/json.loadswith pydantic_coreto_json/from_json _serialize_response: model list mapping now handled by Pydantic instead of manual recursion
Fixed¶
- Issue with parsing repeated query parameters in URL.
Removed¶
- The
use_aliasesfromBaseRouterand reverted changes from 0.6.0.
[0.6.0] – 2025‑04‑16¶
Added¶
- The
use_aliasesparameter was added to theBaseRouterconstructor. Default isTrue. To preserve the previous behavior (without using aliases from Pydantic), setuse_aliases=False.
Changed¶
- The
_serialize_response methodis now an instance method (was a@staticmethod) — to supportuse_aliases. - The
_get_model_schemamethod was temporarily changed from a@classmethodto a regular method — for consistent behavior withuse_aliases.
Deprecated¶
use_aliasesis deprecated and will be removed in version 0.7.0.
[0.5.0] - 2025-04-13¶
Added¶
- AioHttpRouter for integration with the AIOHTTP framework (async support for AIOHTTP).
- Class-level cache for model schemas to improve performance (avoids regenerating JSON Schema for the same Pydantic model repeatedly).
response_errorsparameter for route decorators to document error responses in OpenAPI.error_handlermodule for standard error responses (provides exceptions likeBadRequestError,ResourceNotFoundError, etc., as described in documentation).- Support for using basic Python types (
int,float,bool,str) asresponse_model(for simple responses).
[0.4.0] - 2025-03-20¶
Added¶
- ReDoc UI support. A ReDoc documentation interface is now served at the default URL (e.g.,
/redoc). - TornadoRouter for integration with the Tornado framework.
Changed¶
- Revised and updated all tests to improve coverage and reliability.
Fixed¶
- Status code for internal error responses: changed from 422 to 500 for unhandled exceptions, providing a more appropriate HTTP status for server errors.
Removed¶
- Removed the
add_docs_routeandadd_openapi_routemethods fromBaseRouter. Documentation routes are now added by default, so these manual methods are no longer needed.
[0.3.1] - 2025-03-15¶
Fixed¶
- Fixed import issue for routers when a framework is not installed. (Guarded against
ModuleNotFoundErrorif an extra was not installed and its router was imported.)
[0.3.0] - 2025-03-15¶
Added¶
- QuartRouter for integration with the Quart framework (async Flask-like framework).
- Initial documentation (introduction and basic usage examples) added to repository.
Changed¶
- Import syntax for routers simplified: you can now do
from fastopenapi.routers import YourRouter(e.g.,FlaskRouter) instead of deeper module paths.
Fixed¶
- Fixed retrieving parameters for BaseModel arguments in GET routes. Query parameters based on Pydantic models now work correctly.
[0.2.1] - 2025-03-12¶
Fixed¶
- Fixed an issue in internal response serialization:
_serialize_responsenow correctly handlesBaseModelinstances by converting them to dict before JSON encoding (preventing a TypeError). - Resolved a bug causing
DataLoaderto crash when processing empty datasets. (This appears to be an internal utility, possibly used for schema generation.) - Added more tests to cover these scenarios.
- Added this
CHANGELOG.mdfile to track changes.
[0.2.0] - 2025-03-11¶
Added¶
- Implemented
resolve_endpoint_paramsinBaseRouterto systematically resolve function parameters (path, query, body) and integrate with Pydantic validation. - Added
prefixparameter to theinclude_routermethod, allowing grouping routes under a path. - Implemented
status_codesupport for responses in route decorators (could specify default status code for each endpoint).
Changed¶
- Refactored all router implementations for consistency and to reduce code duplication.
Removed¶
- Removed the
register_routesmethod from Starlette integration (no longer needed after refactor).
[0.1.0] - 2025-03-01¶
Added¶
- Initial release of FastOpenAPI.
- Core functionality implemented:
- Base classes and structure for routers.
- Router support for Falcon, Flask, Sanic, Starlette.
- OpenAPI schema generation leveraging Pydantic v2.
- Basic validation for query and body parameters.
- Included basic documentation in README and a few examples.
- Added initial test suite covering basic route registration and schema generation.