Starlette Admin

0.16.0 · active · verified Fri Apr 17

Starlette Admin is a fast, beautiful, and extensible administrative interface framework designed for Starlette and FastAPI applications. It provides a robust backend to manage your database models with support for various ORMs like SQLAlchemy, MongoDB (via Motor/Beanie), Odmantic, and Tortoise ORM. The current version is 0.16.0, and it maintains an active release cadence with frequent updates and bug fixes.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to integrate Starlette Admin with a FastAPI application using SQLAlchemy. It sets up a basic `User` model, initializes the admin interface with a `ModelView` for `User`, and mounts it to the FastAPI app. Ensure you install `starlette-admin[sqla]` and `uvicorn` to run this example.

import uvicorn
from fastapi import FastAPI
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker

from starlette_admin.app import Admin
from starlette_admin.contrib.sqla import ModelView

# 1. Setup Database (SQLAlchemy Example)
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String)
    email = Column(String, unique=True, index=True)

# Create tables
Base.metadata.create_all(bind=engine)

# 2. Setup FastAPI App
app = FastAPI()

# 3. Setup Starlette Admin
admin = Admin(engine, title="My Admin Dashboard")

# Add ModelViews
admin.add_view(ModelView(User))

# Mount Admin to FastAPI
admin.mount_to(app)

# Optional: Add a root route
@app.get("/", include_in_schema=False)
async def read_root():
    return {"message": "Welcome to FastAPI with Starlette Admin!"}

if __name__ == "__main__":
    # Populate some data if needed (run once)
    with SessionLocal() as db:
        if not db.query(User).first():
            db.add(User(name="Alice", email="alice@example.com"))
            db.add(User(name="Bob", email="bob@example.com"))
            db.commit()
    uvicorn.run(app, host="0.0.0.0", port=8000)

view raw JSON →