All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Async executor lifecycle is now exception-safe and re-entrant. Apps registered with
register_fastapi_extensions,register_starlette_extensions, orregister_quart_extensionscan now start and stop repeatedly (e.g. multipleTestClientcycles) without failing, and an exception during a wrapped lifespan no longer leaks the executor (#14). - Renders that happen outside a lifespan/serving cycle now use a lazy per-registration fallback executor that honors
max_workers, instead of degrading to a shared 4-worker pool.
- The FastAPI and Starlette example apps now use
enable_async=Trueenvironments and render pages viarender_async, exercising the executor lifecycle. - Added more package keywords (Jinja, HTMX, components, fragments, and the supported frameworks) for better PyPI discoverability.
register_quart_extensions(app, max_workers)- Lifecycle-managed registration for Quart appsregister_fastapi_extensions(app, templates, max_workers)- Lifecycle-managed registration for FastAPI apps- Updated
register_starlette_extensions(templates, app, max_workers)- Optional app parameter for lifecycle management - Example apps for FastAPI, Starlette, and Quart in
examples/directory
- Async rendering now works with Quart, FastAPI, and Starlette frameworks
- Fixed "asyncio.run() cannot be called from a running event loop" error when using
render_partialin async environments - Templates compiled with
enable_async=Truenow render correctly via ThreadPoolExecutor
- Minimum Python version is now 3.10
- Version info now uses package metadata instead of hardcoded value
- Reorganized examples:
example/renamed toexamples/with multiple framework examples
See GitHub releases for earlier history.