Release Notes
0.38.2
July 27, 2024
fixed
- does not assume that all routines have
__name__onrouting.get_name()#2648.
0.38.1
23 July 2024
has been removed
- Restore "Add support for ASGI pathsend extensions"#2649.
0.38.0
20 July 2024
added
- allows
StreamingResponsesumResponseUsed in #2576 and #2577memoryview。 - sends 404 instead of 500 when file name requested in
StaticFiles#2583 is too long.
change (or: change)
- quickly fails on invalid
Jinja2Templateinstantiation parameter #2568. - Check endpoint handler asynchronous only once #2536.
fixed
- adds appropriate synchronization to
WebSocketTestSession#2597.
0.37.2
5 March 2024
added
- Add
bytesto_RequestDatatype #2510.
fixed
- Revert "Turn
scope["client"]toNoneonTestClient(#2377)" #2525. - Remove deprecated
appargument passed tohttpx.Clienton theTestClient#2526.
0.37.1
February 9, 2024
Fixed
- Warn instead of raise for missing env file on
Config#2485.
0.37.0
February 5, 2024
Added
- Support the WebSocket Denial Response ASGI extension #2041.
0.36.3
February 4, 2024
Fixed
- Create
anyio.Eventon async context #2459.
0.36.2
February 3, 2024
Fixed
0.36.1
January 23, 2024
Fixed
- Check if "extensions" in scope before checking the extension #2438.
0.36.0
January 22, 2024
added
- Add support for ASGI
pathsendextension #2435. - Cancel
WebSocketTestSessionon close #2427. - Raise
WebSocketDisconnectwhenWebSocket.send()exceptsIOError#2425. - Raise
FileNotFoundErrorwhen theenv_fileparameter onConfigis not valid #2422.
0.35.1
January 11, 2024
fixed
- Stop using the deprecated "method" parameter in
FileResponseinside ofStaticFiles#2406. - Make
typing-extensionsoptional again #2409.
0.35.0
January 11, 2024
added
- adds
*argstoMiddlewareand improves its type hint #2381.
fixed
- uses
Iterableinstead ofIteratoroniterate_in_threadpool#2362
change
- handles
root_pathto maintain compatibility with installed ASGI applications and WSGI #2400. - Change
scope["client"]toNoneonTestClient#2377
0.34.0
December 16, 2023
added
- uses
ParamSpecforrun_in_threadpool#2375. - Add
UploadFile.__repr__#2360.
fixed
- merges URLs correctly on
TestClient#2376. - Consider weak ETags on
StaticFiles#2334.
is obsolete
- deprecates
FileResponse(method=...)parameter #2366.
0.33.0
1 December 2023
added
- Add
middleware#2349 perRoute/WebSocketRoute. - Add
middleware#2351 to everyRouter.
fixed
- Do not overwrite
"path"and"root_path"range keys #2352. - will
ensure_ascii=Falsebe set injson.dumps()above, forWebSocket.send_json()#2341 。
0.32.0.post1
November 5, 2023
fixed
- Rolled back mkdocs-material from 9.1.17 to 9.4.7 #2326.
0.32.0
4 November 2023
added
- sends
reason#2309 onWebSocketDisconnect. - adds the
domainparameter toSessionMiddleware#2280.
change; change; alter
- inherits from
HTMLResponseinstead ofResponseon_TemplateResponse#2274. - reverts the
Response.rendertype annotation to its pre-0.31.0 state #2264.
0.31.1
26 August 2023
fixed
- repair when
exceptiongroupImport error #2231 when unavailable. - Set
url_forglobal variable #2230 for custom Jinja environment.
0.31.0
24 July 2023
added
- Officially support Python 3.12 #2214.
- Support AnyIO 4.0 #2211.
- Strictly type annotate Starlette (strict mode on mypy) #2180.
Fixed
- Don't group duplicated headers on a single string when using the
TestClient#2219.
0.30.0
July 13, 2023
Removed
- Drop Python 3.7 support #2178.
0.29.0
July 13, 2023
Added
- Add
follow_redirectsparameter toTestClient#2207. - Add
__str__toHTTPExceptionandWebSocketException#2181. - Warn users when using
lifespantogether withon_startup/on_shutdown#2193. - Collect routes from
Hostto generate the OpenAPI schema #2183. - Add
requestargument toTemplateResponse#2191.
fixed
- Stop
body_streamin casemore_body=FalseonBaseHTTPMiddleware#2194.
0.28.0
June 7, 2023
Changed
- Reuse
Request's body buffer for call_next inBaseHTTPMiddleware#1692. - Move exception handling logic to
Route#2026.
added
- will
envparameter is added toJinja2Templatesand abandoned.**env_options#2159 。 - adds explicit error message #2177 when
httpxis not installed.
fixed
- allows the "name" parameter on
templates url_for()#2127.
0.27.0
16 May 2023
This release fixes a path traversal vulnerability in StaticFiles. You can view the full security bulletin: https://github.com/encode/starlette/security/advisory/GHSA-v5gw-mw7f-84px
added
- reduces JSON WebSocket data via
send_json, see https://github.com/encode/starlette/pull/2128 for details
fixed
- On
StaticFiles1797de4, replacecommonprefixwithcommonpath. - Convert ImportErrors to ModuleNotFoundError #2135.
- Correct RuntimeError message content in websockets #2141.
0.26.1
13 March 2023
fixed
- Fixed Lifespan type in Starlette #2077 to allow subclasses.
0.26.0.post1
March 9, 2023
Fixed
- Replace reference from Events to Lifespan on the mkdocs.yml #2072.
0.26.0
March 9, 2023
Added
- Support lifespan state #2060, #2065 and #2064.
Changed
- Change
url_forsignature to return aURLinstance #1385.
Fixed
- Allow "name" argument on
url_for()andurl_path_for()#2050.
Deprecated
- Deprecate
on_startupandon_shutdownevents #2070.
0.25.0
February 14, 2023
Fix
- Limit the number of fields and files when parsing
multipart/form-dataon theMultipartParser8c74c2c and #2036.
0.24.0
February 6, 2023
added
- Allow
StaticFilesto follow symlinks #1683. - Allow
Request.form()as a context manager #1903. - Add
sizeattribute toUploadFile#1405. - Add
env_prefixargument toConfig#1990. - Add template context processors #1904.
- Support
stranddatetimeonexpiresparameter on theResponse.set_cookiemethod #1908.
Changed
- Lazily build the middleware stack #2017.
- Make the
fileargument required onUploadFile#1413. - Use debug extension instead of custom response template extension #1991.
fixed
- Fix url parsing of ipv6 urls on
URL.replace#1965.
0.23.1
December 9, 2022
fixed
- Only stop receiving stream on
body_streamif body is empty on theBaseHTTPMiddleware#1940.
0.23.0
December 5, 2022
added
- Add
headersparameter to theTestClient#1966.
is obsolete
- deprecated
StarletteandRouterdecorator #1897.
fixed
- repair
FloatConvertorError #1973 on regular expressions.
0.22.0
17 November 2022
changed
- When the response contains
Content-Encoding#1901, go aroundGZipMiddleware。
fixed
- from
TestClientDelete unwanted query parameters on #1953unquote()。 - guarantee
MutableHeaders._listis actually alist#1917 。 Import compatibility of* with the next version ofAnyIO#1936.
0.21.0
26 September 2022
This version replaces the base HTTP client used on TestClient(requests :arrow_right: httpx), your test suite may break due to slightly different APIs for these clients. To make the migration smoother, you can use the bump-testclient tool.
change (or: change)
- In
TestClient#1376, replacerequestswithhttpx
added
- Add
WebSocketExceptionand support for WebSocket exception handlers #1263. - Add
middlewareparameter toMountclass #1649. - Officially support Python 3.11 #1863.
- Implement
__repr__for route classes #1864.
Fixed
- Fix bug on which
BackgroundTaskswere cancelled when usingBaseHTTPMiddlewareand client disconnected #1715.
0.20.4
June 28, 2022
Fixed
- Remove converter from path when generating OpenAPI schema #1648.
0.20.3
June 10, 2022
Fixed
- Revert "Allow
StaticFilesto follow symlinks" #1681.
0.20.2
June 7, 2022
fixed
0.20.1
May 28, 2022
fixed
- Improve detection of async callables #1444.
- Send 400 (Bad Request) when
boundaryis missing #1617. - Send 400 (Bad Request) when missing "name" field on
Content-Dispositionheader #1643. - Do not send empty data to
StreamingResponseonBaseHTTPMiddleware#1609. - Add
__bool__dunder forSecret#1625.
0.20.0
May 3, 2022
Removed
0.19.1
April 22, 2022
fixed
- Fix inference of
Route.namewhen created from methods #1553. - Avoid
TypeErroronwebsocket.disconnectwhen code isNone#1574.
is obsolete
- Deprecate
WS_1004_NO_STATUS_RCVDandWS_1005_ABNORMAL_CLOSUREin favor ofWS_1005_NO_STATUS_RCVDandWS_1006_ABNORMAL_CLOSURE, as the previous constants didn't match the WebSockets specs #1580.
0.19.0
March 9, 2022
added
- Error handler will always run, even if the error happens on a background task #761.
- Add
headersparameter toHTTPException#1435. - Internal responses with
405status code insert anAllowheader, as described by RFC 7231 #1436. - in
JSONResponsehit the targetcontentParameter is now required #1431. - Add custom URL converter registration #1437.
- adds content disposition type parameter to
FileResponse#1266. - In Needs Decorator #920, add the next query parameter along with the original request URL.
- Add
raw_pathtoTestClientscope #1445. - Add union operators to
MutableHeaders#1240. - Display missing route details on debug page #1363.
- changed the required version range of
anyioto>=3.4.0,<5.0#1421 and #1460. - Add
typing-extensions>=3.10requirement-Use #1475 only in versions earlier than Python 3.10.
fixed
- prevents
BaseHTTPMiddlewarefrom hidingStreamingResponseas well as errors in installed app #1459. SessionMiddlewareuses explicitpath=...instead of ASGI's "root_path"#1512 by default.Request.clientNow compliant with ASGI specification #1462.- promoted
KeyErrorearly on for missing boundary #1349.
is obsolete
0.18.0
January 23, 2022
Added
- Change default chunk size from 4Kb to 64Kb on
FileResponse#1345. - Add support for
functools.partialinWebSocketRoute#1356. - Add
StaticFilespackages with directory #1350. - Allow environment options in
Jinja2Templates#1401. - Allow HEAD method on
HttpEndpoint#1346. - Accept additional headers on
websocket.acceptmessage #1361 and #1422. - Add
reasontoWebSocketclose ASGI event #1417. - Add headers attribute to
UploadFile#1382. - Don't omit
Content-Lengthheader forContent-Length: 0cases #1395. - Don't set headers for responses with 1xx, 204 and 304 status code #1397.
SessionMiddleware.max_agenow acceptsNone, so cookie can last as long as the browser session #1387.
fixed
- Tweak
hashlib.md5()function onFileResponses ETag generation. The parameterusedforsecurityflag is set toFalse, if the flag is available on the system. This fixes an error raised on systems with FIPS enabled #1366 and #1410. - Fix
path_paramstype onurl_path_for()method i.e. turnstrintoAny#1341. Hostnow ignoresporton routing #1322.
0.17.1
November 17, 2021
fixed
- Fix
IndexErrorin authenticationrequireswhen wrapped function arguments are distributed between*argsand**kwargs#1335.
0.17.0
November 4, 2021
added
Response.delete_cookienow accepts the same parameters asResponse.set_cookie#1228.- Update the
Jinja2Templatesconstructor to allowPathLike#1292.
fixed
- Fix BadSignature exception handling in SessionMiddleware #1264.
- Change
HTTPConnection.__getitem__return type fromstrtotyping.Any#1118. - Change
ImmutableMultiDict.getlistreturn type fromtyping.List[str]totyping.List[typing.Any]#1235. - Handle
OSErrorexceptions onStaticFiles#1220. - Fix
StaticFiles404.html in HTML mode #1314. - Prevent anyio.ExceptionGroup in error views under a BaseHTTPMiddleware #1262.
Removed
- Remove GraphQL support #1198.
0.16.0
July 19, 2021
added
fixed
starlette.websockets.WebSocketinstances are now hashable and compare by identity #1039- A number of fixes related to running task groups in lifespan #1213, #1227
Deprecated/removed
- The method
starlette.templates.Jinja2Templates.get_envwas removed #1218 - The ClassVar
starlette.testclient.TestClient.async_backendwas removed, the backend is now configured using constructor kwargs #1211 - Passing an Async Generator Function or a Generator Function to
starlette.routing.Router(lifespan=)is deprecated. You should wrap your lifespan in@contextlib.asynccontextmanager. #1227 #1110
0.15.0
June 23, 2021
This release makes significant changes to the underlying asynchronous part of Starlette. As a result, Starlette now relies on AnyIO, and some minor API changes have occurred. Another major change in this release is the deprecation of built-in GraphQL support.
added
- Starlette now supports Trio as an asynchronous runtime via AnyIO- #1157.
TestClient.websocket_connect()It must now be used as a context manager.- Initial support for Python 3.10- #1201.
- compression level used in
GZipMiddlewareis now adjustable- #1128.
fixed
- right
CORSMiddlewareSee #1111,#1112,#1113,#1199. - Improved exception message in case of duplicate path parameter name- #1177.
RedirectResponsenow usesquoteencoding instead ofquote_plusencoding in theLocationheader to better match behavior in other frameworks such as Django- #1164.- In more cases, exception causes are now retained- #1158.
- Session cookies now use the ASGI root path- #1147 when the application is mounted.
- Fixed a cache invalidation error- #1023 when deleting static files under certain circumstances.
- improves
BaseHTTPMiddlewarememory usage when handling large responses-fix #1012 via #1157
Deprecated/Removed
- Built-in GraphQL support via the
GraphQLAppclass has been deprecated and will be removed in a future release. Please see #619. GraphQL is not supported on Python 3.10. - The
executorparameter toGraphQLAppwas removed. Useexecutor_classinstead. - The
workersparameter toWSGIMiddlewarewas removed. This hasn't had any effect since Starlette v0.6.3.
0.14.2
February 2, 2021
Fixed
- Fixed
ServerErrorMiddlewarecompatibility with Python 3.9.1/3.8.7 when debug mode is enabled - #1132. - Fixed unclosed socket
ResourceWarnings when using theTestClientwith WebSocket endpoints - #1132. - Improved detection of
asyncendpoints wrapped infunctools.partialon Python 3.8+ - #1106.
0.14.1
November 9th, 2020
Removed
UJSONResponsewas removed (this change was intended to be included in 0.14.0). Please see the documentation for how to implement responses using custom JSON serialization - #1074.
0.14.0
November 8th, 2020
added
- Starlette now officially supports Python3.9.
- In
StreamingResponse, allow custom async iterator such as objects from classes implementing__aiter__. - Allow usage of
functools.partialasync handlers in Python versions 3.6 and 3.7. - Add 418 I'm A Teapot status code.
Changed
- Create tasks from handler coroutines before sending them to
asyncio.wait. - Use
format_exceptioninstead offormat_tbinServerErrorMiddleware'sdebugresponses. - Be more lenient with handler arguments when using the
requiresdecorator.
0.13.8
-
Revert
Queue(maxsize=1)fix forBaseHTTPMiddlewaremiddleware classes and streaming responses. -
The
StaticFilesconstructor now allowspathlib.Pathin addition to strings for itsdirectoryargument.
0.13.7
- Fix high memory usage when using
BaseHTTPMiddlewaremiddleware classes and streaming responses.
0.13.6
- Fix 404 errors with
StaticFiles.
0.13.5
- adds support for
Starlette(lifespan=...)functionality. - More robust path traversal checking in the StaticFiles application.
- Fix WSGI PATH_INFO encoding.
- RedirectResponse now accepts optional background parameters
- Allow path routes to contain regular expression metacharacters
- Consider ASGI HTTP's "body" as an optional key.
- Do not use thread pools for uploads written to memory.
0.13.0
- Switch around to facilitate application configuration in initialization style. This means abandoning decorator style in favor of declarative routing tables and middleware definitions.
0.12.12
- fixes
request.url_for()issues for nested installation cases.
0.12.11
- Fix
request.url_for()when using ASGIroot_path.
0.12.1
- add
URL.include_query_params(**kwargs) - add
URL.replace_query_params(**kwargs) - add
URL.remove_query_params(param_names) request.statePerforms correctly in middleware.- adds the
request.scopeinterface.
0.12.0
- Switch to ASGI 3.0.
- Repair of CORS middleware.
- Add
StaticFiles(html=True)support. - Fix path quoting in redirect responses.
0.11.1
- Add
request.stateinterface, for storing arbitrary additional information. - Support disabling GraphiQL with
GraphQLApp(..., graphiql=False).
0.11.0
DatabaseMiddlewareis now dropped in favour ofdatabases- Templates are no longer configured on the application instance. Use
templates = Jinja2Templates(directory=...)andreturn templates.TemplateResponse('index.html', {"request": request}) - Schema generation is no longer attached to the application instance. Use
schemas = SchemaGenerator(...)andreturn schemas.OpenAPIResponse(request=request) LifespanMiddlewareis dropped in favor of router-based lifespan handling.- Application instances now accept a
routesargument,Starlette(routes=[...]) - Schema generation now includes mounted routes.
0.10.6
- Add
Lifespanrouting component.
0.10.5
- Ensure
templatingdoes not strictly requirejinja2to be installed.
0.10.4
- Templates are now configured independently from the application instance.
templates = Jinja2Templates(directory=...). Existing API remains in place, but is no longer documented, and will be deprecated in due course. See the template documentation for more details.
0.10.3
- Move to independent
databasespackage instead ofDatabaseMiddleware. Existing API remains in place, but is no longer documented, and will be deprecated in due course.
0.10.2
- Don't drop explicit port numbers on redirects from
HTTPSRedirectMiddleware.
0.10.1
- Added MySQL database support.
- Add host-based routing.
0.10.0
- WebSockets now send/receive JSON via text data frames by default.
.send_json(data, mode="binary")sum.receive_json(mode="binary")Perform binary framing. GraphQLAppNow accept an offerexecutor_classparameter, which should be used in preference to the existingexecutorParameter. Resolves the problem of instantiating asynchronous executors before the event loop is set. ExpectedexecutorParameters are deprecated in the next medium or major release. The authentication and@requiresdecorator now support WebSocket endpoints. TheMultiDictandImmutableMultiDictclasses are available inuvicorn.datastructures.QueryParamsis now instantiated with standard dictionary-style*args, **kwargsparameters.
0.9.11
- Session cookies now include the browser's "expires" in addition to the existing signed expiration time.
request.form()Now returns a multi-dictionary interface.- Query parameter multi-dictionary implementation when multiple identical key items occur
.keys()、.values()sum.items()The behavior can be more accurately reflecteddict。 - uses
urlsplitinstead ofurlparsethroughout the process.
0.9.10
- supports
@requires(...)on class methods. - Apply URL escaping to the form data.
- automatically supports
HEADrequests. - Add
await request.is_disconnected(). - Pass the operationName to the GraphQL executor.
0.9.9
- Add
TemplateResponse. - Add
CommaSeparatedStringsdatatype. - Add
BackgroundTasksfor multiple tasks. - Common subclass for
RequestandWebSocket, to eg. sharesessionfunctionality. - Expose remote address with
request.client.
0.9.8
- Add
request.database.executemany.
0.9.7
- Ensure that
AuthenticationMiddlewarehandles lifespan messages correctly.
0.9.6
- Add
AuthenticationMiddleware, and@requires()decorator.
0.9.5
- Support either
strorSecretforSessionMiddleware(secret_key=...).
0.9.4
- Add
config.environ. - Add
datastructures.Secret. - Add
datastructures.DatabaseURL.
0.9.3
- Add
config.Config(".env")
0.9.2
- Add optional database support.
- Add
requestto GraphQL context. - Hide any password component in
URL.__repr__.
0.9.1
- Handle startup/shutdown errors properly.
0.9.0
TestClientcan now be used as a context manager, instead ofLifespanContext.- Lifespan is now handled as middleware. Startup and Shutdown events are visible throughout the middleware stack.
0.8.8
- Better support for third-party API schema generators.
0.8.7
- Support chunked requests with TestClient.
- Cleanup asyncio tasks properly with WSGIMiddleware.
- Support using TestClient within endpoints, for service mocking.
0.8.6
- Session cookies are now set on the root path.
0.8.5
- Support URL converter.
- support comes from
StaticFilesHTTP 304 cache response. - Resolves character escape issues in form data.
0.8.4
- The default body in the response is empty.
0.8.3
- adds the "name" parameter to
@app.route(). - URL reconstruction using the "Host" header.
0.8.2
static file
- StaticFiles no longer reads files in response to
HEADrequests.
0.8.1
templated
- Use Jinja2 to add default template configurations.
Allow the following:
app = Starlette(template_directory="templates")
@app.route('/')
async def homepage(request):
# `url_for` is available inside the template.
template = app.get_template('index.html')
content = template.render(request=request)
return HTMLResponse(content)
0.8.0
exception
- adds support for
@app.exception_handler(404). - Ensure that handled exceptions are not treated as errors by the middleware stack.
Session middleware
- Add
max_age, and use timestamp-signed cookies. Defaults to two weeks.
Cookies
- Ensure cookies are strictly HTTP correct.
StaticFiles
- Check directory exists on instantiation.
0.7.4
Concurrency
- Add
starlette.concurrency.run_in_threadpool. Now handlescontextvarsupport.
0.7.3
Routing
- Add
name=support toapp.mount(). This allows eg:app.mount('/static', StaticFiles(directory='static'), name='static').
0.7.2
Middleware
- Add support for
@app.middleware("http")decorator.
Routing
- Add "endpoint" to ASGI scope.
0.7.1
Debug tracebacks
- Improve debug traceback information & styling.
URL routing
- Support mounted URL lookups with "path=", eg.
url_for('static', path=...). - Support nested URL lookups, eg.
url_for('admin:user', username=...). - Add redirect slashes support.
- Add www redirect support.
Background tasks
- Add background task support to
FileResponseandStreamingResponse.
0.7.0
API Schema support
- Add
app.schema_generator = SchemaGenerator(...). - Add
app.schemaproperty. - Add
OpenAPIResponse(...).
GraphQL routing
- Drop
app.add_graphql_route("/", ...)in favor of more consistentapp.add_route("/", GraphQLApp(...)).
0.6.3
Routing API
- Support routing to methods.
- Ensure
url_path_forworks with Mount('/{some_path_params}'). - Fix Router(default=) argument.
- Support repeated paths, like:
@app.route("/", methods=["GET"]),@app.route("/", methods=["POST"]) - Use the default ThreadPoolExecutor for all sync endpoints.
0.6.2
SessionMiddleware
increased the request.session Support, and SessionMiddleware 。
0.6.1
BaseHTTP middleware
Added support for BaseHTTPMiddleware, which provides a standard request/response interface through regular ASGI middleware.
This means you can write ASGI middleware while still working at the request/response level rather than directly processing ASGI messages.
from starlette.applications import Starlette
from starlette.middleware.base import BaseHTTPMiddleware
class CustomMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
response = await call_next(request)
response.headers['Custom-Header'] = 'Example'
return response
app = Starlette()
app.add_middleware(CustomMiddleware)
0.6.0
Request.path_params
0.6 The biggest change in is that endpoint signatures are no longer:
async def func(request: Request, **kwargs) -> Response
Instead, we simply use:
async def func(request: Request) -> Response
Path parameters are specified in the request as request.path_params Forms are available.
This is different from most Python web frameworks, but I think it ends up being more consistent throughout.
request.url_for()
Request and WebSocketSession now support using request.url_for(name, **path_params) for URL reversal. This method returns a fully qualified URL An instance of a URL is a string-like object.
app. url_path_for()(This English expression may be the name of a specific function or method in the technical field. In the Chinese context, the English expression of the original text is sometimes retained to ensure accuracy and professionalism. Therefore, the translation here directly retains the English form of the original text)
The application now supports URL path inversion using app.url_path_for(name, **path_params). This method returns an URL instance with the path and schema set. A URL instance is a string-like object that returns only the path if cast to string.
app. Routing
The application now supports an .routes parameter that returns a list of [Route|WebSocketRoute|Mount].
routing, WebSocket routing, mount
low-level components to Router present and @app.route() 、 @app.websocket_route() sum app.mount() The signatures match.