Aller au contenu
Traduction automatique supervisée

Ce contenu est traduit à l'aide d'une génération automatique guidée par des glossaires et des guides de style élaborés par des humains. Le texte n'étant pas relu manuellement ligne par ligne, des erreurs ou des tournures maladroites peuvent occasionnellement apparaître.

En cas de divergence, la version anglaise constitue la source de référence.

Lire la version originale en anglais

Nouvelle documentation  ·  Découvrez ce qui a changé

Interfaces d'administration extensibles
pour FastAPI et Starlette

Générez une interface d'administration complète à partir de vos modèles SQLAlchemy, SQLModel, Beanie, MongoEngine ou Tortoise ORM. Basé sur le kit UI Tabler, starlette-admin vous offre des vues en liste, des formulaires générés automatiquement, des exports de données et une authentification sécurisée. Configurez l'intégralité de l'interface en Python, sans écrire la moindre ligne de code frontend.

pip install starlette-admin
tableau de bord starlette-admin avec widgets statistiques, tables d'activité récente et barre latérale pour les vues de modèles

Fonctionnalités intégrées

Tout ce dont vous avez besoin fonctionne dès l'installation. Chaque fonctionnalité principale inclut des points d'extension documentés, afin que vous puissiez l'adapter à vos exigences.

Tables

Parcourez, recherchez et triez vos données avec pagination, tri multi-colonnes et URLs préservant l'état. Modifiez les champs directement depuis la vue en liste.

Filtres

Composez des requêtes AND/OR imbriquées dans l'interface, avec des opérateurs adaptés aux types pour le texte, les nombres, les dates et les booléens.

Formulaires et téléversements

Générez automatiquement des formulaires pour plus de 25 types de champs ainsi que pour les données relationnelles. Envoyez les fichiers vers un stockage local ou S3.

Actions

Créez des opérations en masse ou au niveau de chaque ligne avec de simples décorateurs Python. Protégez chaque exécution derrière des modales de confirmation et des formulaires de payload personnalisés.

Export et import

Exportez vos enregistrements en CSV, Excel, JSON, PDF ou dans tout format pris en charge par tablib. Importez des données en masse grâce à un assistant axé sur l'aperçu qui valide chaque ligne avant toute écriture en base.

Authentification et sécurité

Connectez le fournisseur d'authentification que vous utilisez déjà. Déployez avec des réglages prêts pour la production, incluant la protection CSRF et des limites intégrées pour les exports et imports.

Formulaires inline

Gérez les données relationnelles directement sur place. Modifiez les enregistrements enfants dans le formulaire du modèle parent sans quitter la page.

Tableaux de bord

Construisez une page d'accueil à partir de widgets statistiques, graphiques et tableaux intégrés, ou remplacez-la par une vue entièrement personnalisée.

i18n et fuseaux horaires

Servez l'interface d'administration en plusieurs langues, avec un formatage tenant compte de la locale et une gestion précise des fuseaux horaires, dès l'installation.

Tout se fait en Python

Construisez une interface d'administration complète avec une API Python pure, conçue pour le développement rapide, une syntaxe lisible et une maintenabilité durable.

Monter le panneau d'administration

Enregistrez un modèle et montez le panneau d'administration sur n'importe quelle application FastAPI ou Starlette. Exécutez ensuite fastapi dev et ouvrez /admin.

Consulter la documentation

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)

Vues

Définissez la recherche, le tri, l'ordre par défaut et les formats d'export à l'aide de simples attributs de classe. Agencez vos formulaires de création et d'édition avec form_layout.

Consulter la documentation

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"))

Champs

Remplacez n'importe quel champ détecté automatiquement pour contrôler la validation, la visibilité par page et la façon dont starlette-admin lit et affiche les valeurs.

Consulter la documentation

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),
    ]

Filtres

Étendez le générateur de requêtes intégré avec des filtres personnalisés qui reflètent vos règles métier. Vous pouvez appliquer les opérations dont vous avez besoin directement sur le modèle de base de données sous-jacent.

Consulter la documentation

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

Actions

Attachez des opérations métier avec un seul décorateur. Les modales de confirmation, les formulaires personnalisés et les messages flash sont intégrés au framework.

Consulter la documentation

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")

Authentification

Implémentez trois méthodes standard autour de votre propre vérification des identifiants. starlette-admin gère pour vous la page de connexion, les sessions et les redirections.

Consulter la documentation

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)

Tableau de bord

Composez la page d'accueil de l'admin à partir de widgets statistiques, graphiques et tableaux qui interrogent des données en temps réel à chaque requête.

Consulter la documentation

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),
)

Plugins et extensions

Chaque couche est remplaçable. Empaquetez des fonctionnalités sous forme de plugins autonomes, ou accrochez-vous à un point d'extension dédié pour adapter le framework à votre domaine.

Plugins prêts à l'emploi

Des plugins sans code superflu

Installez un paquet de plugin et transmettez-le à votre instance Admin. Champs, convertisseurs, templates et ressources se connectent entre eux automatiquement.

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

admin = Admin(
    engine,
    plugins=[GeospatialPlugin(default_zoom=13)],
)
Lire le guide des plugins
Points d'extension

Accrochez-vous à n'importe quel composant

Des interfaces prédéfinies vous permettent de remplacer ou d'étendre chaque préoccupation de manière indépendante. Héritez de la classe de base souhaitée et enregistrez-la. Vous pouvez tout personnaliser, du flux d'authentification aux formats d'export.

Explorer tous les points d'extension