Перейти к содержанию
Машинный перевод под контролем человека

Этот контент переведён с помощью машинной генерации, направляемой составленными людьми глоссариями и руководствами по стилю. Поскольку текст не проверяется вручную построчно, возможны отдельные ошибки или неестественные формулировки.

В случае любых расхождений авторитетным источником считается оригинальная версия на английском языке.

Читать оригинал на английском

Новая документация  ·  Посмотрите, что изменилось

Расширяемые административные интерфейсы
для FastAPI & Starlette

Создавайте полноценный административный интерфейс на основе ваших моделей SQLAlchemy, SQLModel, Beanie, MongoEngine или Tortoise ORM. Построенный на базе UI-кита Tabler, starlette-admin предоставляет представления списков, автоматически генерируемые формы, экспорт данных и безопасную аутентификацию. Настройте весь интерфейс на Python, не написав ни строчки frontend-кода.

pip install starlette-admin
starlette-admin dashboard showing statistical widgets, recent activity tables, and a sidebar for model views

Встроенные возможности

Всё необходимое работает сразу после установки. Каждая ключевая возможность имеет документированные точки расширения, поэтому вы можете адаптировать её под свои требования.

Таблицы

Просматривайте, ищите и сортируйте данные с постраничной навигацией, сортировкой по нескольким столбцам и URL, сохраняющими состояние. Редактируйте поля прямо в представлении списка.

Фильтры

Собирайте вложенные запросы AND/OR прямо в интерфейсе, пользуясь операторами, которые учитывают тип данных: текст, числа, даты и логические значения.

Формы и загрузка файлов

Автоматически создавайте формы более чем для 25 типов полей и для связанных данных. Отправляйте загруженные файлы в локальное хранилище или S3.

Действия

Создавайте массовые и построчные операции с помощью стандартных декораторов Python. Каждый запуск можно защитить модальным окном подтверждения и собственной формой с данными запроса.

Экспорт и импорт

Экспортируйте записи в CSV, Excel, JSON, PDF или любой формат, который поддерживает tablib. Импортируйте данные пакетно с помощью мастера, который сначала показывает предпросмотр и проверяет каждую строку до записи в базу данных.

Аутентификация и безопасность

Подключите провайдер аутентификации, которым вы уже пользуетесь. Разверните проект с настройками по умолчанию, готовыми к production, включая защиту от CSRF и встроенные ограничения на экспорт и импорт.

Встроенные формы

Управляйте связанными данными на месте. Редактируйте дочерние записи прямо в форме родительской модели, не покидая страницу.

Дашборды

Соберите главную страницу из встроенных виджетов статистики, графиков и таблиц или замените её полностью настраиваемым представлением.

i18n и часовые пояса

Предоставляйте админ-панель на нескольких языках с форматированием с учётом локали и точной обработкой часовых поясов из коробки.

Всё — это Python

Создавайте полноценный административный интерфейс с помощью чистого Python API, спроектированного для быстрой разработки, читаемого синтаксиса и долгосрочной сопровождаемости.

Подключите админ-панель

Зарегистрируйте модель и подключите админ-панель к любому приложению FastAPI или Starlette. Затем запустите fastapi dev и откройте /admin.

Открыть документацию

main.py
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.

Открыть документацию

views.py
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 считывает и отображает значения.

Открыть документацию

views.py
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),
    ]

Фильтры

Расширяйте встроенный конструктор запросов собственными фильтрами, отвечающими вашим бизнес-правилам. Необходимые операции можно применять непосредственно к модели базы данных.

Открыть документацию

filters.py
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.

Открыть документацию

views.py
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 возьмёт на себя страницу входа, сессии и перенаправления.

Открыть документацию

auth.py
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)

Дашборд

Собирайте главную страницу панели из виджетов статистики, графиков и таблиц, которые запрашивают актуальные данные при каждом обращении.

Открыть документацию

dashboard.py
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. Поля, конвертеры, шаблоны и ассеты подключатся между собой автоматически.

from starlette_admin_geospatial import GeospatialPlugin
from starlette_admin.contrib.sqla import Admin

admin = Admin(
    engine,
    plugins=[GeospatialPlugin(default_zoom=13)],
)
Читать руководство по плагинам
Точки расширения

Подключайтесь к любому компоненту

Предопределённые интерфейсы позволяют независимо заменять или расширять каждый аспект работы системы. Наследуйте нужный базовый класс и зарегистрируйте его. Можно настроить всё: от процесса аутентификации до форматов экспорта.

Изучить все точки расширения