release_notes.md
July 15, 2026 · View on GitHub
Releases Notes
- 0.32 - Harden request parsing, multipart streaming, sessions, parameter binding, logging, and response streaming. URL-encoded query and form parsing remain permissive and compatible with earlier releases.
- Breaking — session binding: HTTP and WebSocket handler arguments are no longer populated from session data. Read trusted state explicitly from
self.request.session. - Breaking —
Request.form()and JSON:Request.form()no longer returns values from JSON bodies because JSON objects are no longer mirrored intobody_params. Userequest.json(...)instead. Top-level JSON keys still bind to handler arguments, now with native JSON types. - Breaking — session IDs: Session cookies and explicit
WebSocket.accept(session_id=...)values use canonical UUIDv4 validation by default. Custom backends must configure matchingsession_id_factoryandsession_id_validatorcallables; otherwise existing non-UUID sessions are rejected. - Breaking — request limits: Requests now default to a 16 MiB total body limit and multipart text fields to 1 MiB. Configure larger values or
Nonewhen an application intentionally accepts more. - Breaking — multipart failures: An aborted upload now raises
MultipartFileErrorfrom the file queue instead of yielding a cleanNonesentinel. TreatNoneas successful EOF and handle the exception as an incomplete upload. - Breaking — Python requirement: Package metadata now requires Python 3.11 or newer, matching the framework's use of Python 3.11 asyncio APIs. Older interpreters are no longer accepted by installers.
- Integration changes: JSON response bodies passed to HTTP middleware are consistently text even when
orjsonis installed, and unhandled WebSocket handler failures now use a generic1011close reason while logging details server-side.
- Breaking — session binding: HTTP and WebSocket handler arguments are no longer populated from session data. Read trusted state explicitly from
- 0.31 - Security fix: route lookup now ignores non-callable public attributes and property-like descriptors, preventing internal App attributes from being treated as handlers while preserving descriptor-backed route methods.
- 0.30 - Remove the public
Request.get_jsonattribute. UseRequest.json()orRequest.json(name, default). - 0.29 - Performance upgrades, no more per request signature inspections for routing. 24%-54% increase in req/sec.
- 0.28 - Add
Request.jsonhelper - 0.27 - Add
Request.queryandRequest.formhelpers - 0.26 - Sub-app routing no longer depends on middleware ordering
- 0.25 - Fix unicode redirect handling. Percent-encode non-ASCII path segments before setting Location header. Prevents latin-1 header encoding errors and avoids double-encoding queries.
- 0.24 - Improve session handling. Expired sessions now clean up properly, and empty sessions delete stored data. Session saving also moved after
after_requestmiddleware. - 0.23 - Bug fix release. Make sure background multipart parsing stops when the request is terminated by middleware
- 0.22 - Bug fix release. Fix sub-app body parsing bug by ensuring
Requestobject inherits scope'sbody_paramsandbody_parsed, preventing redundant parsing in sub-app - 0.21 - Bug fix release. Make sure index route handler can handle path params
- 0.20 - Enable concurrent multipart parsing and file writing with bounded queues
- 0.19 - Easier debugging with
traceback. Add_sub_appattribute to allow middleware to mount other ASGI applications - 0.18 - Ensure handlers that return async generators are killed upon client disconnect to prevent memory leaks
- 0.17 - Change API of lifespan events to match API of middlewaress, eg.
app.startup_handlers.append(handler) - 0.16 - Add support for lifespan events using
on_startupandon_shutdown - 0.15 - Minor bug fixes in the optional dependencies if statements
- 0.14 - Change import to
micropieinstead ofMicroPieBREAKING CHANGE - 0.13 - Introduce built-in WebSocket support
All releases since 0.13 will be listed here. For older releases see tags on Github
