Getting Started¶
Installation¶
pip install litestar
Tip
litestar[standard]
includes commonly used extras like uvicorn
and jinja2
(for templating).
Extras
- Pydantic
pip install litestar[pydantic]
- Attrs
pip install litestar[attrs]
- Brotli Compression Middleware:
pip install litestar[brotli]
- Cookie Based Sessions
pip install litestar[cryptography]
- JWT
pip install litestar[jwt]
- RedisStore
pip install litestar[redis]
- Picologging
pip install litestar[picologging]
- StructLog
pip install litestar[structlog]
- Prometheus Instrumentation
pip install litestar[prometheus]
- Open Telemetry Instrumentation
pip install litestar[opentelemetry]
- SQLAlchemy
pip install litestar[sqlalchemy]
- CLI
Deprecated since version 2.1.1: The
litestar
base installation now includes the CLI dependencies and this group is no longer required to use the CLI. If you need the optional CLI dependencies, install thestandard
group instead. Will be removed in 3.0pip install litestar[cli]
- Jinja Templating
pip install litestar[jinja]
- Mako Templating
pip install litestar[mako]
- Polyfactory to generate OpenAPI examples
pip install litestar[structlog]
- HTMX plugin
pip install litestar[htmx]
- OpenAPI YAML rendering
pip install litestar[yaml]
- Standard Installation (includes Uvicorn and Jinja2 templating):
pip install litestar[standard]
- All Extras:
pip install litestar[full]
Note
The full extras is not recommended because it will add a lot of unnecessary extras.
Minimal Example¶
At a minimum, make sure you have installed litestar[standard]
, which includes uvicorn.
First, create a file named app.py
with the following contents:
from litestar import Litestar, get
@get("/")
async def index() -> str:
return "Hello, world!"
@get("/books/{book_id:int}")
async def get_book(book_id: int) -> dict[str, int]:
return {"book_id": book_id}
app = Litestar([index, get_book])
Then, run the following command:
litestar run
# Or you can run Uvicorn directly:
uvicorn app:app --reload
You can now visit http://localhost:8000/
and http://localhost:8000/books/1
in your browser and
you should see the responses of your two endpoints:
"Hello, world!"
and
{"book_id": 1}
Tip
You can also check out the automatically generated OpenAPI-based documentation at:
http://localhost:8000/schema
(for ReDoc),http://localhost:8000/schema/swagger
(for Swagger UI),http://localhost:8000/schema/elements
(for Stoplight Elements)http://localhost:8000/schema/rapidoc
(for RapiDoc)
You can check out a more in-depth tutorial in the Developing a basic TODO application section!
Expanded Example¶
Define your data model using pydantic or any library based on it (for example ormar, beanie, SQLModel):
from pydantic import BaseModel, UUID4
class User(BaseModel):
first_name: str
last_name: str
id: UUID4
You can also use dataclasses (standard library and Pydantic),
typing.TypedDict
, or msgspec.Struct
.
from uuid import UUID
from dataclasses import dataclass
from litestar.dto import DTOConfig, DataclassDTO
@dataclass
class User:
first_name: str
last_name: str
id: UUID
class PartialUserDTO(DataclassDTO[User]):
config = DTOConfig(exclude={"id"}, partial=True)
Define a Controller for your data model:
from typing import List
from litestar import Controller, get, post, put, patch, delete
from litestar.dto import DTOData
from pydantic import UUID4
from my_app.models import User, PartialUserDTO
class UserController(Controller):
path = "/users"
@post()
async def create_user(self, data: User) -> User: ...
@get()
async def list_users(self) -> List[User]: ...
@patch(path="/{user_id:uuid}", dto=PartialUserDTO)
async def partial_update_user(
self, user_id: UUID4, data: DTOData[User]
) -> User: ...
@put(path="/{user_id:uuid}")
async def update_user(self, user_id: UUID4, data: User) -> User: ...
@get(path="/{user_id:uuid}")
async def get_user(self, user_id: UUID4) -> User: ...
@delete(path="/{user_id:uuid}")
async def delete_user(self, user_id: UUID4) -> None: ...
from litestar import Controller, get, post, put, patch, delete
from litestar.dto import DTOData
from pydantic import UUID4
from my_app.models import User, PartialUserDTO
class UserController(Controller):
path = "/users"
@post()
async def create_user(self, data: User) -> User: ...
@get()
async def list_users(self) -> list[User]: ...
@patch(path="/{user_id:uuid}", dto=PartialUserDTO)
async def partial_update_user(
self, user_id: UUID4, data: DTOData[User]
) -> User: ...
@put(path="/{user_id:uuid}")
async def update_user(self, user_id: UUID4, data: User) -> User: ...
@get(path="/{user_id:uuid}")
async def get_user(self, user_id: UUID4) -> User: ...
@delete(path="/{user_id:uuid}")
async def delete_user(self, user_id: UUID4) -> None: ...
When instantiating your app, import your controller into your application’s entry-point and pass it to Litestar:
from litestar import Litestar
from my_app.controllers.user import UserController
app = Litestar(route_handlers=[UserController])
To run your application, use an ASGI server such as uvicorn :
uvicorn my_app.main:app --reload
Philosophy¶
Litestar is a community-driven project. This means not a single author, but rather a core team of maintainers is leading the project, supported by a community of contributors. Litestar currently has 5 maintainers and is being very actively developed.
Litestar draws inspiration from NestJS - a contemporary TypeScript framework - which places opinions and patterns at its core.
While still allowing for function-based endpoints, Litestar seeks to build on Python’s powerful and versatile OOP, by placing class-based controllers at its core.
Litestar is not a microframework. Unlike frameworks such as FastAPI, Starlette, or Flask, Litestar includes a lot of functionalities out of the box needed for a typical modern web application, such as ORM integration, client- and server-side sessions, caching, OpenTelemetry integration, and many more. It’s not aiming to be “the next Django” (for example, it will never feature its own ORM), but its scope is not micro either.
Feature comparison with similar frameworks¶
Feature |
Litestar |
FastAPI |
Starlette |
Sanic |
Quart |
---|---|---|---|---|---|
OpenAPI |
|||||
Automatic API documentation |
Swagger, ReDoc, Stoplight Elements |
Swagger, ReDoc |
|||
Data validation |
|||||
Dependency Injection |
|||||
Class based routing |
Extension |
||||
ORM integration |
SQLAlchemy, Tortoise, Piccolo |
Extension |
|||
Templating |
Jinja, Mako |
Jinja |
Jinja |
Jinja |
Jinja |
MessagePack |
|||||
CORS |
Extension |
||||
CSRF |
|||||
Rate-limiting |
Extension |
||||
JWT |
|||||
Sessions |
Client-side |
Client-side |
Client-side |
||
Authentication |
JWT / Session based |
||||
Caching |
Example Applications¶
litestar-pg-redis-docker : In addition to Litestar, this demonstrates a pattern of application modularity, SQLAlchemy 2.0 ORM, Redis cache connectivity, and more. Like all Litestar projects, this application is open to contributions, big and small.
litestar-fullstack : A fully-capable, production-ready fullstack Litestar web application configured with best practices. It includes SQLAlchemy 2.0, ReactJS, Vite, SAQ job queue,
Jinja
templates and more. Read more.litestar-hello-world: A bare-minimum application setup. Great for testing and POC work.