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

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

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

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

Переход с Flask-Admin

starlette-admin начинался как перенос концепций Flask-Admin в экосистему ASGI, поэтому миграция происходит напрямую. Вы по-прежнему создаёте подкласс ModelView, настраиваете его через атрибуты класса и регистрируете его в экземпляре Admin. Основная работа сводится к переименованию атрибутов и переходу от неявного контекста запроса Flask к явному объекту request в Starlette.

Это руководство сопоставляет API Flask-Admin, атрибут за атрибутом, с его эквивалентом в starlette-admin.

Концептуальная модель

Концепция Flask-Admin Эквивалент в starlette-admin
Admin(app, name="...") Admin(engine, title="..."), затем admin.mount_to(app)
ModelView(Model, db.session) ModelView(Model); экземпляр Admin владеет engine и сессиями базы данных
flask_admin.contrib.sqla starlette_admin.contrib.sqla
flask_admin.contrib.mongoengine starlette_admin.contrib.mongoengine
бэкенды peewee / pymongo Beanie, Tortoise ORM, SQLModel или собственный бэкенд
BaseView + @expose CustomView
AdminIndexView Admin(index_view=...), DefaultIndexView
Контекст запроса Flask (flask.request) Явный параметр request: Request в каждом hook'е
Синхронные методы async-методы; синхронные по-прежнему работают там, где допускаются вызываемые объекты

Настройка

from flask import Flask
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView

app = Flask(__name__)
admin = Admin(app, name="My Admin", template_mode="bootstrap4")
admin.add_view(ModelView(Post, db.session))
from starlette.applications import Starlette
from starlette_admin.contrib.sqla import Admin, ModelView

app = Starlette()  # or FastAPI()
admin = Admin(engine, title="My Admin", secret_key="change-me")
admin.add_view(ModelView(Post))
admin.mount_to(app)

Переключателя template_mode здесь нет. Интерфейс использует Tabler (Bootstrap 5) и включает тёмную тему. Чтобы изменить внешний вид, напишите собственный BaseTheme или переопределите шаблоны.

Атрибуты страницы списка

Flask-Admin starlette-admin Примечания
column_list fields Также управляет страницами деталей и формами. Для вариаций на отдельных страницах используйте атрибуты exclude_fields_from_*.
column_exclude_list exclude_fields_from_list
column_labels label= Например, StringField("title", label="Headline")
column_descriptions help_text= Относится к определению поля.
column_formatters formatter= у поля Например, StringField("title", formatter={RequestAction.LIST: lambda request, value: value[:40]}).
column_formatters_detail / export formatters Тот же словарь formatter=, ключами которого являются значения RequestAction Одно сопоставление покрывает форматирование для списка, деталей и экспорта. Действия без записи сохраняют исходное значение.
column_type_formatters Индивидуальный formatter= у каждого поля либо собственный подкласс поля Реестра по типам нет. Прикрепите formatter к каждому полю или создайте подкласс поля и используйте его повторно.
Свойства модели или вызываемые объекты в column_list ComputedField или getter= у любого поля Добавляет виртуальные столбцы или переопределяет получение значения существующего поля без создания подкласса.
Пользовательские поля WTForms (преобразование значений) parser= у поля Заменяет стандартный парсинг формы или импорта для конкретного RequestAction.
column_searchable_list searchable_fields
column_filters searchable_fields в сочетании с индивидуальным filters= у полей Заменяет плоский список фильтров визуальным конструктором, поддерживающим вложенные группы AND/OR.
column_sortable_list sortable_fields
column_default_sort fields_default_sort Например, [("created_at", True)] выполняет сортировку по убыванию.
column_editable_list inline_editable_fields Пользователь выбирает ячейку и редактирует её прямо на месте.
page_size page_size
can_set_page_size page_size_options По умолчанию [10, 25, 50, 100]. Пользователи выбирают из этих вариантов.
column_display_pk Включите первичный ключ в fields
column_details_list fields минус exclude_fields_from_detail Страница деталей встроена по умолчанию. Опции can_view_details не требуется.

Атрибуты форм

Flask-Admin starlette-admin Примечания
form_columns fields минус exclude_fields_from_create и exclude_fields_from_edit
form_excluded_columns exclude_fields_from_create, exclude_fields_from_edit Раздельное управление видимостью для каждой формы.
form_overrides Явные экземпляры полей в fields Например, fields = ["id", TextAreaField("bio")]
form_args Аргументы конструктора поля Например, StringField("title", required=True, help_text="...")
form_choices EnumField Например, EnumField("status", choices=[("draft", "Draft"), ("live", "Live")])
form_extra_fields Дополнительные элементы в fields Поддерживает любое поле, не привязанное к столбцу базы данных, например ComputedField.
form_widget_args Атрибуты поля Задайте read_only, disabled или placeholder непосредственно у поля.
form_rules form_layout Заменяет плоские правила на fieldset'ы, вкладки и адаптивные сетки.
create_modal / edit_modal Недоступно Страницы создания и редактирования отображаются как полноценные страницы.
on_form_prefill hook before_edit

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

class PostView(ModelView):
    can_export = True
    export_types = ["csv", "xlsx"]
    export_max_rows = 10000
class PostView(ModelView):
    exporters = ["csv", "xlsx", "pdf"]
    importers = ["csv", "xlsx"]
    exclude_fields_from_export = ["internal_notes"]

Экспорт в CSV и JSON включён по умолчанию. Ограничения на количество строк применяются автоматически, а экранирование формул в электронных таблицах — это опциональная настройка exporter'а. Импорт, который Flask-Admin не предоставляет, включает этап предварительного просмотра с валидацией каждой строки и опциональным обновлением существующих записей по первичному ключу. См. раздел Экспорт и импорт.

Действия (Actions)

from flask_admin.actions import action


class PostView(ModelView):
    @action("publish", "Publish", "Publish selected posts?")
    def action_publish(self, ids):
        query = Post.query.filter(Post.id.in_(ids))
        for post in query.all():
            post.published = True
from starlette_admin import ActionSelection, action, flash


class PostView(ModelView):
    actions = ["publish", "delete"]

    @action(
        name="publish",
        text="Publish",
        confirmation="Publish selected posts?",
    )
    async def publish(self, request: Request, selection: ActionSelection) -> None:
        for post in await selection.rows():
            post.published = True
        flash(request, "Posts published")

Обработчик получает объект ActionSelection вместо «сырых» идентификаторов. Он лениво извлекает строки, предоставляет доступ к активным фильтрам и работает одинаково, когда пользователь выбирает все подходящие записи на всех страницах. Действия также могут отображать произвольную HTML-форму внутри диалога подтверждения. Для операций над отдельными строками @row_action и @link_row_action заменяют пользовательские column formatters.

Права доступа и контроль доступа

Флаги классов can_* во Flask-Admin превращаются в starlette-admin в методы, вызываемые для каждого запроса, благодаря чему решения об авторизации могут зависеть от текущего пользователя.

Flask-Admin starlette-admin Примечания
is_accessible() is_accessible(request) Скрывает view из меню и блокирует прямой доступ.
inaccessible_callback() Обрабатывается механизмом аутентификации Неаутентифицированные запросы перенаправляются на страницу входа.
can_create = False def can_create(self, request): return False can_edit и can_delete следуют тому же шаблону.
can_view_details can_view_detail(request) Страница деталей существует по умолчанию.
can_export can_export(request), плюс can_import(request)
Нет эквивалента can_access_field(request, field) Управляет видимостью на уровне отдельного поля для каждого пользователя.
Нет эквивалента is_action_allowed(request, name) Предоставляет авторизацию для каждого действия.

Во Flask-Admin вы интегрируете Flask-Login самостоятельно. starlette-admin поставляется с AuthProvider, включающим готовую страницу входа, а вам остаётся реализовать методы login, logout и authenticate поверх вашего хранилища пользователей. OAuthProvider покрывает сценарии перенаправления OIDC. Текущий пользователь доступен везде как request.state.admin_user.

Hook'и жизненного цикла модели

Flask-Admin starlette-admin
on_model_change(form, model, is_created) before_create(request, data, obj) / before_edit(request, data, obj)
after_model_change after_create / after_edit
on_model_delete before_delete
after_model_delete after_delete
get_query / get_count_query get_list_query / get_count_query, специфичные для бэкенда SQLAlchemy
handle_view_exception Возбудите исключение FormValidationError или ActionFailed

Помимо hook'ов отдельных view, система событий позволяет одному обработчику наблюдать за всеми view. Во Flask-Admin аналога нет.

from starlette_admin.events import AdminEvent, AfterCreateContext


async def audit(ctx: AfterCreateContext) -> None: ...


admin.events.on(AdminEvent.AFTER_CREATE, audit)

Пользовательские view и главная страница

Flask-Admin starlette-admin Примечания
BaseView + @expose("/") CustomView(menu_label=..., path=..., widget=...) Собирайте страницы из widget'ов, не создавая шаблоны вручную.
Рендеринг пользовательских шаблонов Подкласс CustomView Даёт полный контроль над маршрутами и ответами.
AdminIndexView Admin(index_view=...) Создавайте дашборды из StatWidget, ChartWidget, TableWidget и layout-widget'ов.
MenuLink View Link Например, admin.add_link(Link(menu_label="Docs", url="https://..."))
Категории в меню View DropDown Группирует view вместе в боковой панели.
FileAdmin Недоступно Вложения обрабатываются полями файлов и изображений с локальным хранилищем или S3. Файлового браузера на сервере нет.

Встроенные модели (Inline models)

class ArticleView(ModelView):
    inline_models = [Comment]
from starlette_admin.contrib.sqla import InlineModelView, ModelView


class CommentInline(InlineModelView):
    model = Comment
    fields = ["author", "body"]


class ArticleView(ModelView):
    inlines = [CommentInline]

Явный класс даёт каждой встроенной модели полный набор возможностей конфигурации ModelView: выбор полей, валидацию и поддержку составных внешних ключей. См. раздел Встроенные формы.

Интернационализация

Flask-Admin зависит от Flask-Babel и окружения Flask. starlette-admin вместо этого использует объект конфигурации:

from starlette_admin import I18nConfig

admin = Admin(engine, i18n_config=I18nConfig(default_locale="fr"))

Отображение даты и времени с учётом часового пояса работает аналогичным образом — через TimezoneConfig. См. раздел Интернационализация и часовые пояса.

Что вы получаете при переходе

  • Асинхронный стек. Нативно работает на FastAPI и Starlette с поддержкой async SQLAlchemy, Beanie и Tortoise ORM. Flask-Admin синхронен.
  • Встроенные средства безопасности. Защита от CSRF, санитизация имён загружаемых файлов, проверка содержимого изображений и ограничения на количество строк при экспорте включаются сразу после создания экземпляра Admin; экранирование формул в электронных таблицах можно включить в exporter'ах. См. раздел Безопасность.
  • Импорт данных. Этап предварительного просмотра валидирует каждую строку до того, как что-либо будет записано. Во Flask-Admin функции импорта нет.
  • Система виджетов для дашбордов. Создавайте главные страницы и пользовательские view на Python вместо ручного написания шаблонов.
  • Современный дизайн. Активно поддерживаемая кодовая база с аккуратным интерфейсом, встроенной тёмной темой и полноценными аннотациями типов.

Что придётся адаптировать

  • Явные объекты запроса. Неявного контекста запроса нет. Каждый hook и метод проверки прав получает request в качестве параметра.
  • Асинхронные обработчики. Hook'и и действия являются корутинами, поэтому избегайте блокирующих вызовов внутри них или выносите такую работу в отдельный поток.
  • Нет FileAdmin. Если ваш рабочий процесс зависит от просмотра файловой системы сервера, starlette-admin этого не покрывает.
  • Нет модальных окон создания и редактирования. Формы отображаются как полноценные страницы, а не всплывающие модальные окна.