Машинный перевод под контролем человека
Этот контент переведён с помощью машинной генерации, направляемой составленными людьми глоссариями и руководствами по стилю. Поскольку текст не проверяется вручную построчно, возможны отдельные ошибки или неестественные формулировки.
В случае любых расхождений авторитетным источником считается оригинальная версия на английском языке.
Переход с 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-методы; синхронные по-прежнему работают там, где допускаются вызываемые объекты |
Настройка
Переключателя 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 |
Экспорт и импорт
Экспорт в CSV и JSON включён по умолчанию. Ограничения на количество строк применяются автоматически, а экранирование формул в электронных таблицах — это опциональная настройка exporter'а. Импорт, который Flask-Admin не предоставляет, включает этап предварительного просмотра с валидацией каждой строки и опциональным обновлением существующих записей по первичному ключу. См. раздел Экспорт и импорт.
Действия (Actions)
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)
Явный класс даёт каждой встроенной модели полный набор возможностей конфигурации 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 этого не покрывает. - Нет модальных окон создания и редактирования. Формы отображаются как полноценные страницы, а не всплывающие модальные окна.