mirror of
https://github.com/fastapi-admin/fastapi-admin.git
synced 2025-08-06 18:49:47 +08:00
80 lines
2.5 KiB
Python
80 lines
2.5 KiB
Python
from typing import Dict, List, Optional, Type
|
|
|
|
import redis.asyncio as redis
|
|
from fastapi import FastAPI
|
|
from pydantic import HttpUrl
|
|
from starlette.middleware.base import BaseHTTPMiddleware
|
|
from tortoise import Model
|
|
|
|
from fastapi_admin import i18n
|
|
|
|
from . import middlewares, template
|
|
from .providers import Provider
|
|
from .resources import Dropdown
|
|
from .resources import Model as ModelResource
|
|
from .resources import Resource
|
|
from .routes import router
|
|
|
|
|
|
class FastAPIAdmin(FastAPI):
|
|
logo_url: str
|
|
login_logo_url: str
|
|
admin_path: str
|
|
resources: List[Type[Resource]] = []
|
|
model_resources: Dict[Type[Model], Type[Resource]] = {}
|
|
redis: redis.Redis
|
|
language_switch: bool = True
|
|
favicon_url: Optional[HttpUrl] = None
|
|
|
|
async def configure(
|
|
self,
|
|
redis: redis.Redis,
|
|
logo_url: str = None,
|
|
default_locale: str = "en_US",
|
|
language_switch: bool = True,
|
|
admin_path: str = "/admin",
|
|
template_folders: Optional[List[str]] = None,
|
|
providers: Optional[List[Provider]] = None,
|
|
favicon_url: Optional[HttpUrl] = None,
|
|
):
|
|
self.redis = redis
|
|
i18n.set_locale(default_locale)
|
|
self.admin_path = admin_path
|
|
self.language_switch = language_switch
|
|
self.logo_url = logo_url
|
|
self.favicon_url = favicon_url
|
|
if template_folders:
|
|
template.add_template_folder(*template_folders)
|
|
await self._register_providers(providers)
|
|
|
|
async def _register_providers(self, providers: Optional[List[Provider]] = None):
|
|
for p in providers or []:
|
|
await p.register(self)
|
|
|
|
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]):
|
|
r = self.model_resources.get(model)
|
|
return r() if r else None
|
|
|
|
|
|
app = FastAPIAdmin(
|
|
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)
|