如何重写SQLAdmin并配置路由,登录后在仪表盘显示用户名
重写SQLAdmin模板、自定义路由及登录后显示用户名的实现方法
1. 重写SQLAdmin模板
SQLAdmin基于Jinja2模板引擎,重写模板只需指定自定义模板目录并继承原模板修改:
步骤:
- 创建自定义模板目录,比如
templates/admin - 复制SQLAdmin官方基础模板(如
base.html)到该目录,按需修改内容 - 初始化Admin时通过
template_dir参数指定自定义目录
代码示例:
from fastapi import FastAPI from sqladmin import Admin, ModelView from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 初始化FastAPI与数据库连接 app = FastAPI() engine = create_engine("sqlite:///test.db") SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() # 示例模型 class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) username = Column(String, unique=True, index=True) Base.metadata.create_all(bind=engine) # 初始化Admin,指定自定义模板目录 admin = Admin(app, engine, template_dir="templates/admin") # 注册模型视图 class UserAdmin(ModelView, model=User): column_list = [User.id, User.username] admin.add_view(UserAdmin)
2. 自定义路由部署
修改Admin默认路由前缀
初始化Admin时通过base_url参数自定义访问前缀:
admin = Admin(app, engine, template_dir="templates/admin", base_url="/my-admin")
添加自定义路由页面
创建BaseView子类并通过@route装饰器添加自定义端点:
from fastapi import Request from sqladmin.views import BaseView, route class CustomDashboardView(BaseView): @route("/custom-dashboard", methods=["GET"]) async def custom_dashboard(self, request: Request): # 获取当前登录用户 user = await self._get_current_user(request) return await self.templates.TemplateResponse( "custom_dashboard.html", {"request": request, "user": user} ) admin.add_view(CustomDashboardView)
3. 登录后显示用户名
第一步:配置认证后端
先实现SQLAdmin的认证逻辑,确保能识别当前登录用户:
from sqladmin.authentication import AuthenticationBackend from typing import Optional class AdminAuth(AuthenticationBackend): async def login(self, request: Request) -> bool: form = await request.form() username, password = form["username"], form["password"] # 替换为你的实际认证逻辑 if username == "admin" and password == "admin123": request.session.update({"token": "valid-admin-token"}) return True return False async def logout(self, request: Request) -> bool: request.session.clear() return True async def authenticate(self, request: Request) -> Optional[User]: token = request.session.get("token") if token == "valid-admin-token": # 返回当前用户对象,供模板调用 return User(username="admin") return None # 初始化Admin时传入认证后端 admin = Admin( app, engine, template_dir="templates/admin", authentication_backend=AdminAuth() )
第二步:修改模板显示用户名
在自定义的base.html模板中,找到合适位置(比如导航栏右上角)添加以下代码:
{% if current_user %} <span class="navbar-text ms-auto">欢迎, {{ current_user.username }}</span> {% endif %}
内容的提问来源于stack exchange,提问作者Aremoh kenneth
相关产品推荐
相关产品推荐

