## 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 * Add MySQL database support. * Add host-based routing. ## 0.10.0 * WebSockets now default to sending/receiving JSON over text data frames. Use `.send_json(data, mode="binary")` and `.receive_json(mode="binary")` for binary framing. * `GraphQLApp` now takes an `executor_class` argument, which should be used in preference to the existing `executor` argument. Resolves an issue with async executors being instantiated before the event loop was setup. The `executor` argument is expected to be deprecated in the next median or major release. * Authentication and the `@requires` decorator now support WebSocket endpoints. * `MultiDict` and `ImmutableMultiDict` classes are available in `uvicorn.datastructures`. * `QueryParams` is now instantiated with standard dict-style `*args, **kwargs` arguments. ## 0.9.11 * Session cookies now include browser 'expires', in addition to the existing signed expiry. * `request.form()` now returns a multi-dict interface. * The query parameter multi-dict implementation now mirrors `dict` more correctly for the behavior of `.keys()`, `.values()`, and `.items()` when multiple same-key items occur. * Use `urlsplit` throughout in favor of `urlparse`. ## 0.9.10 * Support `@requires(...)` on class methods. * Apply URL escaping to form data. * Support `HEAD` requests automatically. * Add `await request.is_disconnected()`. * Pass operationName to 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 convertors. * Support HTTP 304 cache responses from `StaticFiles`. * Resolve character escaping issue with form data. ## 0.8.4 * Default to empty body on responses. ## 0.8.3 * Add 'name' argument to `@app.route()`. * Use 'Host' header for URL reconstruction. ## 0.8.2 ## StaticFiles * StaticFiles no longer reads the file for responses to `HEAD` requests. ## 0.8.1 ## Templating * Add a default templating configuration with Jinja2. Allows the following: ```python 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 ### Exceptions * Add support for `@app.exception_handler(404)`. * Ensure handled exceptions are not seen as errors by the middleware stack. ### SessionMiddleware * 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 Added support for `request.session`, with `SessionMiddleware`. ## 0.6.1 ### BaseHTTPMiddleware Added support for `BaseHTTPMiddleware`, which provides a standard request/response interface over a regular ASGI middleware. This means you can write ASGI middleware while still working at a request/response level, rather than handling ASGI messages directly. ```python 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 The biggest change in 0.6 is that endpoint signatures are no longer: ```python async def func(request: Request, **kwargs) -> Response ``` Instead we just use: ```python async def func(request: Request) -> Response ``` The path parameters are available on the request as `request.path_params`. This is different to most Python webframeworks, but I think it actually ends up being much more nicely consistent all the way through. ### request.url_for() Request and WebSocketSession now support URL reversing with `request.url_for(name, **path_params)`. This method returns a fully qualified `URL` instance. The URL instance is a string-like object. ### app.url_path_for() Applications now support URL path reversing with `app.url_path_for(name, **path_params)`. This method returns a `URL` instance with the path and scheme set. The URL instance is a string-like object, and will return only the path if coerced to a string. ### app.routes Applications now support a `.routes` parameter, which returns a list of `[Route|WebSocketRoute|Mount]`. ### Route, WebSocketRoute, Mount The low level components to `Router` now match the `@app.route()`, `@app.websocket_route()`, and `app.mount()` signatures.