Машинный перевод под контролем человека
Этот контент переведён с помощью машинной генерации, направляемой составленными людьми глоссариями и руководствами по стилю. Поскольку текст не проверяется вручную построчно, возможны отдельные ошибки или неестественные формулировки.
В случае любых расхождений авторитетным источником считается оригинальная версия на английском языке.
Расширяемые административные интерфейсы
для FastAPI & Starlette
Создавайте полноценный административный интерфейс на основе ваших моделей SQLAlchemy, SQLModel, Beanie, MongoEngine или Tortoise ORM. Построенный на базе UI-кита Tabler, starlette-admin предоставляет представления списков, автоматически генерируемые формы, экспорт данных и безопасную аутентификацию. Настройте весь интерфейс на Python, не написав ни строчки frontend-кода.
pip install starlette-admin
Встроенные возможности
Всё необходимое работает сразу после установки. Каждая ключевая возможность имеет документированные точки расширения, поэтому вы можете адаптировать её под свои требования.
Таблицы
Просматривайте, ищите и сортируйте данные с постраничной навигацией, сортировкой по нескольким столбцам и URL, сохраняющими состояние. Редактируйте поля прямо в представлении списка.
Фильтры
Собирайте вложенные запросы AND/OR прямо в интерфейсе, пользуясь операторами, которые учитывают тип данных: текст, числа, даты и логические значения.
Формы и загрузка файлов
Автоматически создавайте формы более чем для 25 типов полей и для связанных данных. Отправляйте загруженные файлы в локальное хранилище или S3.
Действия
Создавайте массовые и построчные операции с помощью стандартных декораторов Python. Каждый запуск можно защитить модальным окном подтверждения и собственной формой с данными запроса.
Экспорт и импорт
Экспортируйте записи в CSV, Excel, JSON, PDF или любой формат, который поддерживает tablib. Импортируйте данные пакетно с помощью мастера, который сначала показывает предпросмотр и проверяет каждую строку до записи в базу данных.
Аутентификация и безопасность
Подключите провайдер аутентификации, которым вы уже пользуетесь. Разверните проект с настройками по умолчанию, готовыми к production, включая защиту от CSRF и встроенные ограничения на экспорт и импорт.
Встроенные формы
Управляйте связанными данными на месте. Редактируйте дочерние записи прямо в форме родительской модели, не покидая страницу.
Дашборды
Соберите главную страницу из встроенных виджетов статистики, графиков и таблиц или замените её полностью настраиваемым представлением.
i18n и часовые пояса
Предоставляйте админ-панель на нескольких языках с форматированием с учётом локали и точной обработкой часовых поясов из коробки.
Всё — это Python
Создавайте полноценный административный интерфейс с помощью чистого Python API, спроектированного для быстрой разработки, читаемого синтаксиса и долгосрочной сопровождаемости.
Подключите админ-панель
Зарегистрируйте модель и подключите админ-панель к любому приложению FastAPI или Starlette. Затем запустите fastapi dev и откройте /admin.
from fastapi import FastAPI
from sqlalchemy import create_engine
from starlette_admin.contrib.sqla import Admin, ModelView
from models import Base, Post
engine = create_engine("sqlite:///blog.db")
Base.metadata.create_all(engine)
app = FastAPI()
admin = Admin(engine, title="Blog Admin", secret_key="change-me")
admin.add_view(ModelView(Post, icon="fa fa-newspaper"))
admin.mount_to(app)
Представления
Настраивайте поиск, сортировку, порядок по умолчанию и форматы экспорта обычными атрибутами класса. Компонуйте формы создания и редактирования с помощью form_layout.
from starlette_admin.contrib.sqla import ModelView
class PostView(ModelView):
fields = ["id", "title", "author", "content", "published", "created_at"]
searchable_fields = ["title", "content"]
fields_default_sort = [("created_at", True)]
exporters = ["csv", "xlsx", "json"]
form_layout = [
("title", "author"),
"content",
("published", "created_at"),
]
admin.add_view(PostView(Post, icon="fa fa-newspaper"))
Поля
Переопределяйте любые автоматически определённые поля, чтобы управлять валидацией, видимостью на отдельных страницах и тем, как starlette-admin считывает и отображает значения.
from starlette_admin import DateTimeField, RequestAction, StringField, TextAreaField
from starlette_admin.contrib.sqla import ModelView
class PostView(ModelView):
fields = [
"id",
StringField("title", required=True, help_text="Shown on the blog"),
TextAreaField("content", exclude_from_list=True),
StringField(
"author_email",
getter=lambda request, obj: obj.author.email,
formatter={RequestAction.LIST: lambda request, value: value or "unset"},
),
DateTimeField("created_at", read_only=True, exclude_from_create=True),
]
Фильтры
Расширяйте встроенный конструктор запросов собственными фильтрами, отвечающими вашим бизнес-правилам. Необходимые операции можно применять непосредственно к модели базы данных.
from datetime import datetime
from typing import Any
from starlette_admin.contrib.sqla import ModelView
from starlette_admin.filters.base import BaseFilter, FilterApplyContext, FilterDataType
class ActiveThisMonthFilter(BaseFilter):
name = "this_month"
label = "Created this month"
data_type = FilterDataType.NONE # No value input. The range comes from now().
def apply(self, ctx: FilterApplyContext) -> Any:
now = datetime.utcnow()
start = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0)
col = getattr(ctx.view.model, ctx.field_name)
return col.between(start, now)
class ProductView(ModelView):
fields = [
DateTimeField(
"created_at",
filters=[ActiveThisMonthFilter, ...],
),
]
Действия
Добавляйте бизнес-операции одним декоратором. Окна подтверждения, собственные формы и flash-сообщения уже встроены во framework.
from starlette.requests import Request
from starlette_admin import ActionSelection, action, flash
from starlette_admin.contrib.sqla import ModelView
class ArticleView(ModelView):
actions = ["publish", "delete"]
@action(
name="publish",
text="Mark as published",
confirmation="Publish the selected articles?",
submit_btn_text="Yes, publish",
)
async def publish(self, request: Request, selection: ActionSelection) -> None:
articles = await selection.rows()
for article in articles:
article.published = True
flash(request, f"{len(articles)} articles published.", "success")
Аутентификация
Реализуйте три стандартных метода поверх собственной проверки учётных данных. starlette-admin возьмёт на себя страницу входа, сессии и перенаправления.
from starlette.requests import Request
from starlette_admin.auth import AdminUser, AuthProvider, LoginFailed
class MyAuthProvider(AuthProvider):
async def login(self, username, password, remember_me, request: Request) -> None:
if not await check_credentials(username, password):
raise LoginFailed("Invalid username or password")
request.session["username"] = username
async def authenticate(self, request: Request) -> AdminUser | None:
if username := request.session.get("username"):
return AdminUser(username=username)
return None
async def logout(self, request: Request) -> None:
request.session.clear()
admin = Admin(engine, auth_provider=MyAuthProvider(), secret_key=SECRET)
Дашборд
Собирайте главную страницу панели из виджетов статистики, графиков и таблиц, которые запрашивают актуальные данные при каждом обращении.
from starlette_admin import CardRowWidget, ChartWidget, CustomView, StatWidget
dashboard = CardRowWidget(
children=[
StatWidget(title="Orders", value_callback=count_orders, countup=True),
StatWidget(title="Revenue", value_callback=sum_revenue, color="success"),
ChartWidget(title="Sales", chart_type="area", series_callback=sales_series),
]
)
admin = Admin(
engine,
title="Shop Admin",
secret_key="change-me",
index_view=CustomView(menu_label="Dashboard", icon="fa fa-home", widget=dashboard),
)
Плагины и расширения
Каждый слой можно заменить. Упаковывайте функциональность в самодостаточные плагины или подключайтесь к выделенным точкам расширения, чтобы адаптировать framework под свою предметную область.
Плагины без шаблонного кода
Установите пакет плагина и передайте его экземпляру Admin. Поля, конвертеры, шаблоны и ассеты подключатся между собой автоматически.
Подключайтесь к любому компоненту
Предопределённые интерфейсы позволяют независимо заменять или расширять каждый аспект работы системы. Наследуйте нужный базовый класс и зарегистрируйте его. Можно настроить всё: от процесса аутентификации до форматов экспорта.
- Пользовательские поля
BaseField - Пользовательские фильтры
BaseFilter - Экспортеры
BaseExporter - Импортеры
BaseImporter - Темы
BaseTheme - Провайдеры аутентификации
BaseAuthProvider - Бэкенды хранения
BaseStorage - Виджеты дашборда
BaseWidget - Шаблоны
templates_dir