Skip to content


Starlette includes an application class Starlette that nicely ties together all of its other functionality.

from starlette.applications import Starlette
from starlette.responses import PlainTextResponse
from starlette.staticfiles import StaticFiles

app = Starlette()
app.debug = True
app.mount('/static', StaticFiles(directory="static"))

def homepage(request):
    return PlainTextResponse('Hello, world!')

def user_me(request):
    username = "John Doe"
    return PlainTextResponse('Hello, %s!' % username)

def user(request):
    username = request.path_params['username']
    return PlainTextResponse('Hello, %s!' % username)

async def websocket_endpoint(websocket):
    await websocket.accept()
    await websocket.send_text('Hello, websocket!')
    await websocket.close()

def startup():
    print('Ready to go')

Instantiating the application

  • Starlette(debug=False) - Create a new Starlette application.

Adding routes to the application

You can use any of the following to add handled routes to the application:

  • app.add_route(path, func, methods=["GET"]) - Add an HTTP route. The function may be either a coroutine or a regular function, with a signature like func(request, **kwargs) -> response.
  • app.add_websocket_route(path, func) - Add a websocket session route. The function must be a coroutine, with a signature like func(session, **kwargs).
  • @app.route(path) - Add an HTTP route, decorator style.
  • @app.websocket_route(path) - Add a WebSocket route, decorator style.

Adding event handlers to the application

There are two ways to add event handlers:

  • @app.on_event(event_type) - Add an event, decorator style
  • app.add_event_handler(event_type, func) - Add an event through a function call.

event_type must be specified as either 'startup' or 'shutdown'.

Submounting other applications

Submounting applications is a powerful way to include reusable ASGI applications.

  • app.mount(prefix, app) - Include an ASGI app, mounted under the given path prefix

Customizing exception handling

You can use either of the following to catch and handle particular types of exceptions that occur within the application:

  • app.add_exception_handler(exc_class_or_status_code, handler) - Add an error handler. The handler function may be either a coroutine or a regular function, with a signature like func(request, exc) -> response.
  • @app.exception_handler(exc_class_or_status_code) - Add an error handler, decorator style.
  • app.debug - Enable or disable error tracebacks in the browser.

Storing state on the app instance

You can store arbitrary extra state on the application instance, using the generic app.state attribute.

For example:

app.state.ADMIN_EMAIL = ''

Acessing the app instance

Where a request is available (i.e. endpoints and middleware), the app is available on For other situations it can be imported from wherever it's instantiated.