mirror of
https://github.com/fastapi-admin/fastapi-admin.git
synced 2025-08-14 10:47:30 +08:00
81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
from typing import Dict, List, Optional, Type
|
|
|
|
from fastapi import FastAPI
|
|
from starlette.middleware.base import BaseHTTPMiddleware
|
|
from tortoise import Model
|
|
|
|
from . import middlewares, template
|
|
from .providers.login import LoginProvider
|
|
from .resources import Dropdown
|
|
from .resources import Model as ModelResource
|
|
from .resources import Resource
|
|
from .routes import router
|
|
|
|
|
|
class FastAdmin(FastAPI):
|
|
logo_url: str
|
|
admin_path: str
|
|
resources: List[Type[Resource]] = []
|
|
model_resources: Dict[Type[Model], Type[Resource]] = {}
|
|
login_provider: Optional[Type[LoginProvider]] = LoginProvider
|
|
|
|
def configure(
|
|
self,
|
|
logo_url: str = None,
|
|
default_locale: str = "en_US",
|
|
admin_path: str = "/admin",
|
|
template_folders: Optional[List[str]] = None,
|
|
login_provider: Optional[Type[LoginProvider]] = LoginProvider,
|
|
):
|
|
"""
|
|
Config FastAdmin
|
|
:param maintenance: If set True, all request will redirect to maintenance page
|
|
:param logo_url:
|
|
:param default_locale:
|
|
:param admin_path:
|
|
:param template_folders:
|
|
:param login_provider:
|
|
:return:
|
|
"""
|
|
template.set_locale(default_locale)
|
|
self.admin_path = admin_path
|
|
self.logo_url = logo_url
|
|
if template_folders:
|
|
template.add_template_folder(*template_folders)
|
|
self.login_provider = login_provider
|
|
self._register_providers()
|
|
|
|
def _register_providers(self):
|
|
if self.login_provider:
|
|
login_path = self.login_provider.login_path
|
|
app.get(login_path)(self.login_provider.get)
|
|
app.post(login_path)(self.login_provider.post)
|
|
app.get(self.login_provider.logout_path)(self.login_provider.logout)
|
|
app.add_middleware(BaseHTTPMiddleware, dispatch=self.login_provider.authenticate)
|
|
|
|
def register_resources(self, *resource: Type[Resource]):
|
|
for r in resource:
|
|
self.register(r)
|
|
|
|
def _set_model_resource(self, resource: Type[Resource]):
|
|
if issubclass(resource, ModelResource):
|
|
self.model_resources[resource.model] = resource
|
|
elif issubclass(resource, Dropdown):
|
|
for r in resource.resources:
|
|
self._set_model_resource(r)
|
|
|
|
def register(self, resource: Type[Resource]):
|
|
self._set_model_resource(resource)
|
|
self.resources.append(resource)
|
|
|
|
def get_model_resource(self, model: Type[Model]):
|
|
return self.model_resources[model]
|
|
|
|
|
|
app = FastAdmin(
|
|
title="FastAdmin",
|
|
description="A fast admin dashboard based on fastapi and tortoise-orm with tabler ui.",
|
|
)
|
|
app.add_middleware(BaseHTTPMiddleware, dispatch=middlewares.language_processor)
|
|
app.include_router(router)
|