8.7 KiB
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 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)
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 requirejinja2
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 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
- 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 anexecutor_class
argument, which should be used in preference to the existingexecutor
argument. Resolves an issue with async executors being instantiated before the event loop was setup. Theexecutor
argument is expected to be deprecated in the next median or major release.- Authentication and the
@requires
decorator now support WebSocket endpoints. MultiDict
andImmutableMultiDict
classes are available inuvicorn.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 ofurlparse
.
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
andWebSocket
, to eg. sharesession
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
orSecret
forSessionMiddleware(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 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 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:
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 handlescontextvar
support.
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
FileResponse
andStreamingResponse
.
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 consistentapp.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.
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:
async def func(request: Request, **kwargs) -> Response
Instead we just use:
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.