No project description provided
Project description
Admin Dashboard App for FastAPI/Flask/Django
Screenshots
Introduction
FastAdmin is an easy-to-use Admin Dashboard App for FastAPI/Flask/Django inspired by Django Admin.
FastAdmin was built with relations in mind and admiration for the excellent and popular Django Admin. It's engraved in its design that you may configure your admin dashboard for FastAPI/Flask/Django easiest way.
FastAdmin is designed to be minimalistic, functional and yet familiar.
Getting Started
Installation
Install the package using pip:
frameworks: fastapi, django, flask
orms: django, tortoise-orm, pony, sqlalchemy
pip install fastadmin[fastapi,django] # for fastapi with django orm
pip install fastadmin[fastapi,tortoise-orm] # for fastapi with tortoise orm
pip install fastadmin[fastapi,pony] # for fastapi with pony orm
pip install fastadmin[fastapi,sqlalchemy] # for fastapi with sqlalchemy orm
pip install fastadmin[django] # for django with django orm
pip install fastadmin[django,pony] # for django with pony orm
pip install fastadmin[flask,sqlalchemy] # for flask with sqlalchemy
...
for (macos) zsh use
pip install fastadmin\[fastapi,django\]
or using poetry
poetry add 'fastadmin[fastapi,django]' # for fastapi with django orm
poetry add 'fastadmin[fastapi,tortoise-orm]' # for fastapi with tortoise orm
poetry add 'fastadmin[fastapi,pony]' # for fastapi with pony orm
poetry add 'fastadmin[fastapi,sqlalchemy]' # for fastapi with sqlalchemy orm
poetry add 'fastadmin[django]' # for django with django orm
poetry add 'fastadmin[django,pony]' # for django with pony orm
poetry add 'fastadmin[flask,sqlalchemy]' # for flask with sqlalchemy
...
Setup ENV variables
export ADMIN_USER_MODEL=User
export ADMIN_USER_MODEL_USERNAME_FIELD=username
export ADMIN_SECRET_KEY=secret_key
For additional information see Settings documentation.
Quick Tutorial
Setup with your framework:
For FastAPI:
from fastapi import FastAPI
from fastadmin import fastapi_app as admin_app
...
app = FastAPI()
...
app.mount("/admin", admin_app)
...
Run your project (see https://fastapi.tiangolo.com/tutorial/first-steps/):
uvicorn ...
Go to http://localhost:8000/admin.
For Flask:
from flask import Flask
from fastadmin import flask_app as admin_app
...
app = Flask(__name__)
...
app.register_blueprint(admin_app, url_prefix="/admin")
...
Run your project (see https://flask.palletsprojects.com/en/2.2.x/quickstart/):
flask ...
Go to http://localhost:5000/admin.
For Django:
In root urls.py
from django.urls import path
from fastadmin import get_django_admin_urls as get_admin_urls
...
urlpatterns = [
path("admin/", get_admin_urls()),
]
Run your project (see https://docs.djangoproject.com/en/4.1/intro/):
python manage.py runserver
Go to http://localhost:8000/admin.
Register ORM models:
You have to implement authenticate method for FastAdmin authentication on AdminModel class which is registered for ADMIN_USER_MODEL.
For Tortoise ORM:
import bcrypt
from tortoise.models import Model
from fastadmin import register, TortoiseModelAdmin
class User(Model):
username = fields.CharField(max_length=255, unique=True)
hash_password = fields.CharField(max_length=255)
is_superuser = fields.BooleanField(default=False)
is_active = fields.BooleanField(default=False)
...
async def __str__(self):
return self.username
class Group(Model):
name = fields.CharField(max_length=255)
...
async def __str__(self):
return self.name
@register(User)
class UserAdmin(TortoiseModelAdmin):
exclude = ("hash_password",)
list_display = ("id", "username", "is_superuser", "is_active")
list_display_links = ("id", "username")
list_filter = ("id", "username", "is_superuser", "is_active")
search_fields = ("username",)
async def authenticate(self, username: str, password: str) -> UUID | int | None:
user = await User.filter(username=username, is_superuser=True).first()
if not user:
return None
if not bcrypt.checkpw(password.encode(), user.hash_password.encode()):
return None
return user.id
@register(Group)
class GroupAdmin(TortoiseModelAdmin):
list_display = ("id", "name")
list_display_links = ("id",)
list_filter = ("id", "name")
search_fields = ("name",)
For Django ORM:
from django.db import models
from fastadmin import DjangoModelAdmin, register
class User(models.Model):
username = fields.CharField(max_length=255, unique=True)
hash_password = fields.CharField(max_length=255)
is_superuser = fields.BooleanField(default=False)
is_active = fields.BooleanField(default=False)
...
def __str__(self):
return self.username
class Group(models.Model):
name = fields.CharField(max_length=255)
...
def __str__(self):
return self.name
@register(User)
class UserAdmin(DjangoModelAdmin):
exclude = ("hash_password",)
list_display = ("id", "username", "is_superuser", "is_active")
list_display_links = ("id", "username")
list_filter = ("id", "username", "is_superuser", "is_active")
search_fields = ("username",)
def authenticate(self, username, password):
obj = User.objects.filter(username=username, is_superuser=True).first()
if not obj:
return None
if not obj.check_password(password):
return None
return obj.id
@register(Group)
class GroupAdmin(DjangoModelAdmin):
list_display = ("id", "name")
list_display_links = ("id",)
list_filter = ("id", "name")
search_fields = ("name",)
For SQLAlchemy:
import bcrypt
from sqlalchemy import (
Boolean,
String,
select,
)
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from fastadmin import SqlAlchemyModelAdmin, register
sqlalchemy_engine = create_async_engine(
f"sqlite+aiosqlite://db.sqlite",
echo=True,
)
sqlalchemy_sessionmaker = async_sessionmaker(sqlalchemy_engine, expire_on_commit=False)
class Base(DeclarativeBase):
pass
class User(Base):
username: Mapped[str] = mapped_column(String(length=255), nullable=False)
hash_password: Mapped[str] = mapped_column(String(length=255), nullable=False)
is_superuser: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
is_active: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
...
async def __str__(self):
return self.username
class Group(Base):
name: Mapped[str] = mapped_column(String(length=255), nullable=False)
...
async def __str__(self):
return self.name
@register(User, sqlalchemy_sessionmaker=sqlalchemy_sessionmaker)
class UserAdmin(SqlAlchemyModelAdmin):
exclude = ("hash_password",)
list_display = ("id", "username", "is_superuser", "is_active")
list_display_links = ("id", "username")
list_filter = ("id", "username", "is_superuser", "is_active")
search_fields = ("username",)
async def authenticate(self, username, password):
sessionmaker = self.get_sessionmaker()
async with sessionmaker() as session:
query = select(User).filter_by(username=username, password=password, is_superuser=True)
result = await session.scalars(query)
user = result.first()
if not user:
return None
if not bcrypt.checkpw(password.encode(), user.hash_password.encode()):
return None
return user.id
@register(Group, sqlalchemy_sessionmaker=sqlalchemy_sessionmaker)
class GroupAdmin(SqlAlchemyModelAdmin):
list_display = ("id", "name")
list_display_links = ("id",)
list_filter = ("id", "name")
search_fields = ("name",)
For PonyORM:
import bcrypt
from pony.orm import Database, PrimaryKey
from fastadmin import PonyORMModelAdmin, register
db = Database()
db.bind(provider="sqlite", filename="db.sqlite", create_db=True)
class User(db.Entity):
id = PrimaryKey(int, auto=True)
username = Required(str)
hash_password = Required(str)
is_superuser = Required(bool, default=False)
is_active = Required(bool, default=False)
...
def __str__(self):
return self.username
class Group(db.Entity):
id = PrimaryKey(int, auto=True)
name = Required(str)
...
def __str__(self):
return self.name
db.generate_mapping()
@register(User)
class UserAdmin(PonyORMModelAdmin):
exclude = ("hash_password",)
list_display = ("id", "username", "is_superuser", "is_active")
list_display_links = ("id", "username")
list_filter = ("id", "username", "is_superuser", "is_active")
search_fields = ("username",)
@db_session
def authenticate(self, username, password):
user = next((f for f in self.model_cls.select(username=username, password=password, is_superuser=True)), None)
if not user:
return None
if not bcrypt.checkpw(password.encode(), user.hash_password.encode()):
return None
return user.id
@register(Tournament)
class GroupAdmin(PonyORMModelAdmin):
list_display = ("id", "name")
list_display_links = ("id",)
list_filter = ("id", "name")
search_fields = ("name",)
For additional information see ModelAdmin and InlineModelAdmin documentation.
Documentation
See full documentation here.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for fastadmin-0.1.32-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7e438ba4cd7c11f9da50efbd0ac7b5f092b4158c0e87f9486b16db616b84f8e9 |
|
MD5 | abbd0ecea51d3d92580907890bb795ea |
|
BLAKE2b-256 | 160c6bebfc6faecb90cd6e9a111af49fc2d0d7c412ce393c9ea7ba05db2f80d5 |