Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/vsdudakov/fastadmin
FastAdmin is an easy-to-use Admin Dashboard App for FastAPI/Flask/Django inspired by Django Admin.
https://github.com/vsdudakov/fastadmin
admin dashboard django fastadmin fastapi fastapi-admin flask ponyorm sqlalchemy-orm tortoise-orm
Last synced: 3 days ago
JSON representation
FastAdmin is an easy-to-use Admin Dashboard App for FastAPI/Flask/Django inspired by Django Admin.
- Host: GitHub
- URL: https://github.com/vsdudakov/fastadmin
- Owner: vsdudakov
- License: mit
- Created: 2023-02-22T05:26:33.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-08-29T11:07:19.000Z (2 months ago)
- Last Synced: 2024-11-02T15:49:43.105Z (3 days ago)
- Topics: admin, dashboard, django, fastadmin, fastapi, fastapi-admin, flask, ponyorm, sqlalchemy-orm, tortoise-orm
- Language: Python
- Homepage: https://vsdudakov.github.io/fastadmin/
- Size: 21.9 MB
- Stars: 134
- Watchers: 2
- Forks: 15
- Open Issues: 13
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
## Admin Dashboard App for FastAPI/Flask/Django
[![codecov](https://codecov.io/gh/vsdudakov/fastadmin/branch/main/graph/badge.svg?token=RNGX5HOW3T)](https://codecov.io/gh/vsdudakov/fastadmin)
[![License](https://img.shields.io/github/license/vsdudakov/fastadmin)](https://github.com/vsdudakov/fastadmin/blob/master/LICENSE)
[![PyPi](https://badgen.net/pypi/v/fastadmin)](https://pypi.org/project/fastadmin/)
[![Python 3.10](https://img.shields.io/badge/python-3.10-blue.svg)](https://www.python.org/downloads/release/python-3100/)
[![Python 3.11](https://img.shields.io/badge/python-3.11-blue.svg)](https://www.python.org/downloads/release/python-3110/)
[![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/downloads/release/python-3120/)## Screenshots
![SignIn View](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/signin.png)
![List View](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/list.png)
![Change View](https://raw.githubusercontent.com/vsdudakov/fastadmin/main/docs/assets/images/change.png)## Introduction
FastAdmin is an easy-to-use Admin Dashboard App for FastAPI/Django/Flask 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/Django/Flask easiest way.
FastAdmin is designed to be minimalistic, functional and yet familiar.## Getting Started
If you have any questions that are beyond the scope of the documentation, Please feel free to email us.
### Installation
Follow the steps below to setup FastAdmin:
Install the package using pip:
Note: For zsh and macos use:
pip install fastadmin[fastapi,django]
```bash
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```
Install the package using poetry:
```bash
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```
Configure required settings using virtual environment variables:
Note: You can add these variables to .env and use python-dotenv to load them. See all settings here
```bash
export ADMIN_USER_MODEL=User
export ADMIN_USER_MODEL_USERNAME_FIELD=username
export ADMIN_SECRET_KEY=secret_key```
### Quick Tutorial
Setup FastAdmin for a framework
### FastAPI
```python
from fastapi import FastAPIfrom fastadmin import fastapi_app as admin_app
app = FastAPI()
app.mount("/admin", admin_app)
```
### Django
```python
from django.urls import pathfrom fastadmin import get_django_admin_urls as get_admin_urls
from fastadmin.settings import settingsurlpatterns = [
path(f"{settings.ADMIN_PREFIX}/", get_admin_urls()),
]```
### Flask
```python
from flask import Flaskfrom fastadmin import flask_app as admin_app
app = Flask(__name__)
app.register_blueprint(admin_app, url_prefix="/admin")
```
Register ORM models
### Tortoise ORM
```python
from uuid import UUIDimport bcrypt
from tortoise import fields
from tortoise.models import Modelfrom fastadmin import TortoiseModelAdmin, register
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)def __str__(self):
return self.username@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```
### Django ORM
```python
from django.db import modelsfrom fastadmin import DjangoModelAdmin, register
class User(models.Model):
username = models.CharField(max_length=255, unique=True)
hash_password = models.CharField(max_length=255)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)def __str__(self):
return self.username@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```
### SQL Alchemy
```python
import bcrypt
from sqlalchemy import Boolean, Integer, String, select
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_columnfrom fastadmin import SqlAlchemyModelAdmin, register
sqlalchemy_engine = create_async_engine(
"sqlite+aiosqlite:///:memory:",
echo=True,
)
sqlalchemy_sessionmaker = async_sessionmaker(sqlalchemy_engine, expire_on_commit=False)class Base(DeclarativeBase):
passclass User(Base):
__tablename__ = "user"id: Mapped[int] = mapped_column(Integer, primary_key=True, nullable=False)
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)def __str__(self):
return self.username@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```
### Pony ORM
```python
import bcrypt
from pony.orm import Database, PrimaryKey, Required, db_sessionfrom fastadmin import PonyORMModelAdmin, register
db = Database()
db.bind(provider="sqlite", filename=":memory:", create_db=True)class User(db.Entity): # type: ignore [name-defined]
_table_ = "user"
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@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```
## Documentation
See full documentation [here](https://vsdudakov.github.io/fastadmin).## License
This project is licensed under the MIT License - see the [LICENSE](https://github.com/vsdudakov/fastadmin/blob/main/LICENSE) file for details.