Skip to content

Release Notes

0.38.2

July 27, 2024

fixed

  • does not assume that all routines have __name__ on routing.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 StreamingResponse sum Response Used in #2576 and #2577 memoryview 。
  • sends 404 instead of 500 when file name requested in StaticFiles#2583 is too long.

change (or: change)

  • quickly fails on invalid Jinja2Template instantiation parameter #2568.
  • Check endpoint handler asynchronous only once #2536.

fixed

  • adds appropriate synchronization to WebSocketTestSession#2597.

0.37.2

5 March 2024

added

  • Add bytes to _RequestData type #2510.

fixed

  • Revert "Turn scope["client"] to None on TestClient (#2377)" #2525.
  • Remove deprecated app argument passed to httpx.Client on the TestClient #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.Event on async context #2459.

0.36.2

February 3, 2024

Fixed

  • Upgrade python-multipart to 0.0.7 13e5c26.
  • Avoid duplicate charset on Content-Type #2443.

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 pathsend extension #2435.
  • Cancel WebSocketTestSession on close #2427.
  • Raise WebSocketDisconnect when WebSocket.send() excepts IOError #2425.
  • Raise FileNotFoundError when the env_file parameter on Config is not valid #2422.

0.35.1

January 11, 2024

fixed

  • Stop using the deprecated "method" parameter in FileResponse inside of StaticFiles #2406.
  • Make typing-extensions optional again #2409.

0.35.0

January 11, 2024

added

  • adds *args to Middleware and improves its type hint #2381.

fixed

  • uses Iterable instead of Iterator on iterate_in_threadpool#2362

change

  • handles root_path to maintain compatibility with installed ASGI applications and WSGI #2400.
  • Change scope["client"] to None on TestClient#2377

0.34.0

December 16, 2023

added

  • uses ParamSpec for run_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 per Route/WebSocketRoute.
  • Add middleware#2351 to every Router.

fixed

  • Do not overwrite "path" and "root_path" range keys #2352.
  • will ensure_ascii=False be set in json.dumps() above, for WebSocket.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 on WebSocketDisconnect.
  • adds the domain parameter to SessionMiddleware#2280.

change; change; alter

  • inherits from HTMLResponse instead of Response on _TemplateResponse#2274.
  • reverts the Response.render type annotation to its pre-0.31.0 state #2264.

0.31.1

26 August 2023

fixed

  • repair when exceptiongroup Import error #2231 when unavailable.
  • Set url_for global 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_redirects parameter to TestClient #2207.
  • Add __str__ to HTTPException and WebSocketException #2181.
  • Warn users when using lifespan together with on_startup/on_shutdown #2193.
  • Collect routes from Host to generate the OpenAPI schema #2183.
  • Add request argument to TemplateResponse #2191.

fixed

  • Stop body_stream in case more_body=False on BaseHTTPMiddleware #2194.

0.28.0

June 7, 2023

Changed

  • Reuse Request's body buffer for call_next in BaseHTTPMiddleware #1692.
  • Move exception handling logic to Route #2026.

added

  • will env parameter is added to Jinja2Templates and abandoned. **env_options #2159 。
  • adds explicit error message #2177 when httpx is 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 StaticFiles 1797de4, replace commonprefix with commonpath.
  • 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

Changed

  • Change url_for signature to return a URL instance #1385.

Fixed

  • Allow "name" argument on url_for() and url_path_for() #2050.

Deprecated

  • Deprecate on_startup and on_shutdown events #2070.

0.25.0

February 14, 2023

Fix

  • Limit the number of fields and files when parsing multipart/form-data on the MultipartParser 8c74c2c and #2036.

0.24.0

February 6, 2023

added

  • Allow StaticFiles to follow symlinks #1683.
  • Allow Request.form() as a context manager #1903.
  • Add size attribute to UploadFile #1405.
  • Add env_prefix argument to Config #1990.
  • Add template context processors #1904.
  • Support str and datetime on expires parameter on the Response.set_cookie method #1908.

Changed

  • Lazily build the middleware stack #2017.
  • Make the file argument required on UploadFile #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_stream if body is empty on the BaseHTTPMiddleware #1940.

0.23.0

December 5, 2022

added

  • Add headers parameter to the TestClient #1966.

is obsolete

  • deprecated Starlette and Router decorator #1897.

fixed

  • repair FloatConvertor Error #1973 on regular expressions.

0.22.0

17 November 2022

changed

  • When the response contains Content-Encoding #1901, go around GZipMiddleware 。

fixed

  • from TestClient Delete unwanted query parameters on #1953 unquote() 。
  • guarantee MutableHeaders._list is actually a list #1917 。 Import compatibility of* with the next version of AnyIO#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, replace requests with httpx

added

  • Add WebSocketException and support for WebSocket exception handlers #1263.
  • Add middleware parameter to Mount class #1649.
  • Officially support Python 3.11 #1863.
  • Implement __repr__ for route classes #1864.

Fixed

  • Fix bug on which BackgroundTasks were cancelled when using BaseHTTPMiddleware and 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 StaticFiles to follow symlinks" #1681.

0.20.2

June 7, 2022

fixed

  • Fix regression on route paths with colons #1675.
  • Allow StaticFiles to follow symlinks #1337.

0.20.1

May 28, 2022

fixed

  • Improve detection of async callables #1444.
  • Send 400 (Bad Request) when boundary is missing #1617.
  • Send 400 (Bad Request) when missing "name" field on Content-Disposition header #1643.
  • Do not send empty data to StreamingResponse on BaseHTTPMiddleware #1609.
  • Add __bool__ dunder for Secret #1625.

0.20.0

May 3, 2022

Removed

0.19.1

April 22, 2022

fixed

  • Fix inference of Route.name when created from methods #1553.
  • Avoid TypeError on websocket.disconnect when code is None #1574.

is obsolete

  • Deprecate WS_1004_NO_STATUS_RCVD and WS_1005_ABNORMAL_CLOSURE in favor of WS_1005_NO_STATUS_RCVD and WS_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 headers parameter to HTTPException #1435.
  • Internal responses with 405 status code insert an Allow header, as described by RFC 7231 #1436.
  • in JSONResponse hit the target content Parameter 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_path to TestClient scope #1445.
  • Add union operators to MutableHeaders #1240.
  • Display missing route details on debug page #1363.
  • changed the required version range of anyio to >=3.4.0,<5.0#1421 and #1460.
  • Add typing-extensions>=3.10 requirement-Use #1475 only in versions earlier than Python 3.10.

fixed

  • prevents BaseHTTPMiddleware from hiding StreamingResponse as well as errors in installed app #1459.
  • SessionMiddleware uses explicit path=... instead of ASGI's "root_path"#1512 by default.
  • Request.client Now compliant with ASGI specification #1462.
  • promoted KeyError early on for missing boundary #1349.

is obsolete

  • Deprecate WSGIMiddleware in favor of a2wsgi #1504.
  • Deprecate run_until_first_complete #1443.

0.18.0

January 23, 2022

Added

  • Change default chunk size from 4Kb to 64Kb on FileResponse #1345.
  • Add support for functools.partial in WebSocketRoute #1356.
  • Add StaticFiles packages with directory #1350.
  • Allow environment options in Jinja2Templates #1401.
  • Allow HEAD method on HttpEndpoint #1346.
  • Accept additional headers on websocket.accept message #1361 and #1422.
  • Add reason to WebSocket close ASGI event #1417.
  • Add headers attribute to UploadFile #1382.
  • Don't omit Content-Length header for Content-Length: 0 cases #1395.
  • Don't set headers for responses with 1xx, 204 and 304 status code #1397.
  • SessionMiddleware.max_age now accepts None, so cookie can last as long as the browser session #1387.

fixed

  • Tweak hashlib.md5() function on FileResponse s ETag generation. The parameter usedforsecurity flag is set to False, if the flag is available on the system. This fixes an error raised on systems with FIPS enabled #1366 and #1410.
  • Fix path_params type on url_path_for() method i.e. turn str into Any #1341.
  • Host now ignores port on routing #1322.

0.17.1

November 17, 2021

fixed

  • Fix IndexError in authentication requires when wrapped function arguments are distributed between *args and **kwargs #1335.

0.17.0

November 4, 2021

added

  • Response.delete_cookie now accepts the same parameters as Response.set_cookie #1228.
  • Update the Jinja2Templates constructor to allow PathLike #1292.

fixed

  • Fix BadSignature exception handling in SessionMiddleware #1264.
  • Change HTTPConnection.__getitem__ return type from str to typing.Any #1118.
  • Change ImmutableMultiDict.getlist return type from typing.List[str] to typing.List[typing.Any] #1235.
  • Handle OSError exceptions on StaticFiles #1220.
  • Fix StaticFiles 404.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.WebSocket instances 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_env was removed #1218
  • The ClassVar starlette.testclient.TestClient.async_backend was 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 GZipMiddleware is now adjustable- #1128.

fixed

  • right CORSMiddleware See #1111,#1112,#1113,#1199.
  • Improved exception message in case of duplicate path parameter name- #1177.
  • RedirectResponse now uses quote encoding instead of quote_plus encoding in the Location header 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 BaseHTTPMiddleware memory usage when handling large responses-fix #1012 via #1157

Deprecated/Removed

  • Built-in GraphQL support via the GraphQLApp class has been deprecated and will be removed in a future release. Please see #619. GraphQL is not supported on Python 3.10.
  • The executor parameter to GraphQLApp was removed. Use executor_class instead.
  • The workers parameter to WSGIMiddleware was removed. This hasn't had any effect since Starlette v0.6.3.

0.14.2

February 2, 2021

Fixed

  • Fixed ServerErrorMiddleware compatibility with Python 3.9.1/3.8.7 when debug mode is enabled - #1132.
  • Fixed unclosed socket ResourceWarning s when using the TestClient with WebSocket endpoints - #1132.
  • Improved detection of async endpoints wrapped in functools.partial on Python 3.8+ - #1106.

0.14.1

November 9th, 2020

Removed

  • UJSONResponse was 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.partial async 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_exception instead of format_tb in ServerErrorMiddleware's debug responses.
  • Be more lenient with handler arguments when using the requires decorator.

0.13.8

  • Revert Queue(maxsize=1) fix for BaseHTTPMiddleware middleware classes and streaming responses.

  • The StaticFiles constructor now allows pathlib.Path in addition to strings for its directory argument.

0.13.7

  • Fix high memory usage when using BaseHTTPMiddleware middleware 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 ASGI root_path.

0.12.1

  • add URL.include_query_params(**kwargs)
  • add URL.replace_query_params(**kwargs)
  • add URL.remove_query_params(param_names)
  • request.state Performs correctly in middleware.
  • adds the request.scope interface.

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.state interface, for storing arbitrary additional information.
  • Support disabling GraphiQL with GraphQLApp(..., graphiql=False).

0.11.0

  • DatabaseMiddleware is now dropped in favour of databases
  • Templates are no longer configured on the application instance. Use templates = Jinja2Templates(directory=...) and return templates.TemplateResponse('index.html', {"request": request})
  • Schema generation is no longer attached to the application instance. Use schemas = SchemaGenerator(...) and return schemas.OpenAPIResponse(request=request)
  • LifespanMiddleware is dropped in favor of router-based lifespan handling.
  • Application instances now accept a routes argument, Starlette(routes=[...])
  • Schema generation now includes mounted routes.

0.10.6

  • Add Lifespan routing component.

0.10.5

  • Ensure templating does not strictly require jinja2 to 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 databases package instead of DatabaseMiddleware. 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.
  • GraphQLApp Now accept an offer executor_class parameter, which should be used in preference to the existing executor Parameter. Resolves the problem of instantiating asynchronous executors before the event loop is set. Expected executor Parameters are deprecated in the next medium or major release. The authentication and @requires decorator now support WebSocket endpoints. The MultiDict and ImmutableMultiDict classes are available in uvicorn.datastructures.
  • QueryParams is now instantiated with standard dictionary-style *args, **kwargs parameters.

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 reflected dict 。
  • uses urlsplit instead of urlparse throughout the process.

0.9.10

  • supports @requires(...) on class methods.
  • Apply URL escaping to the form data.
  • automatically supports HEAD requests.
  • Add await request.is_disconnected().
  • Pass the operationName to the GraphQL executor.

0.9.9

  • Add TemplateResponse.
  • Add CommaSeparatedStrings datatype.
  • Add BackgroundTasks for multiple tasks.
  • Common subclass for Request and WebSocket, to eg. share session functionality.
  • Expose remote address with request.client.

0.9.8

  • Add request.database.executemany.

0.9.7

  • Ensure that AuthenticationMiddleware handles lifespan messages correctly.

0.9.6

  • Add AuthenticationMiddleware, and @requires() decorator.

0.9.5

  • Support either str or Secret for SessionMiddleware(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 request to GraphQL context.
  • Hide any password component in URL.__repr__.

0.9.1

  • Handle startup/shutdown errors properly.

0.9.0

  • TestClient can now be used as a context manager, instead of LifespanContext.
  • 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 StaticFiles HTTP 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 HEAD requests.

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 handles contextvar support.

0.7.3

Routing

  • Add name= support to app.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 FileResponse and StreamingResponse.

0.7.0

API Schema support

  • Add app.schema_generator = SchemaGenerator(...).
  • Add app.schema property.
  • Add OpenAPIResponse(...).

GraphQL routing

  • Drop app.add_graphql_route("/", ...) in favor of more consistent app.add_route("/", GraphQLApp(...)).

0.6.3

Routing API

  • Support routing to methods.
  • Ensure url_path_for works 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.