Debian系统下SQLAdmin配置指南
SQLAdmin是基于FastAPI/Starlette的现代化数据库管理界面,支持SQLAlchemy、SQLModel等ORM框架。以下是在Debian系统上配置SQLAdmin的详细步骤:
确保系统已安装Python(≥3.8)、pip及数据库驱动(如MySQL需mysql-connector-python、PostgreSQL需psycopg2-binary):
sudo apt update
sudo apt install python3 python3-pip python3-venv
pip install "sqladmin[fastapi]" # 安装SQLAdmin及FastAPI依赖
创建main.py文件,配置数据库连接(以SQLite为例,MySQL/PostgreSQL替换为对应URL):
from fastapi import FastAPI
from sqladmin import Admin
from sqlalchemy import create_engine
# 创建FastAPI应用
app = FastAPI(title="My Admin Panel")
# 配置数据库引擎(SQLite示例,生产环境建议用MySQL/PostgreSQL)
engine = create_engine(
"sqlite:///example.db", # 数据库URL
pool_pre_ping=True, # 自动检测连接有效性
echo=True # 开启SQL日志(调试用)
)
# 初始化SQLAdmin实例
admin = Admin(
app=app, # 关联FastAPI应用
engine=engine, # 绑定数据库引擎
base_url="/admin", # 管理界面基础路径(如http://localhost:8000/admin)
title="数据库管理后台", # 后台标题
)
定义SQLAlchemy模型并创建对应的管理视图(以User模型为例):
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import declarative_base
from sqladmin import ModelView
# 定义基类
Base = declarative_base()
# 定义User模型
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
email = Column(String(100), unique=True)
# 创建模型管理视图
class UserAdmin(ModelView, model=User):
# 列表页配置
column_list = ["id", "name", "email"] # 显示字段
column_searchable_list = ["name", "email"] # 可搜索字段
column_sortable_list = ["id", "name"] # 可排序字段
# 权限配置
can_create = True # 允许创建
can_edit = True # 允许编辑
can_delete = False # 禁止删除
can_view_details = True # 允许查看详情
# 将视图添加到Admin
admin.add_view(UserAdmin)
运行FastAPI应用,访问http://localhost:8000/admin进入管理界面:
uvicorn main:app --reload --host 0.0.0.0 --port 8000
默认情况下,SQLAdmin使用简单的会话认证。可通过继承AuthenticationBackend实现自定义认证(如数据库验证):
from sqladmin.authentication import AuthenticationBackend
from starlette.requests import Request
import logging
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class CustomAuth(AuthenticationBackend):
async def login(self, request: Request) -> bool:
"""处理登录请求"""
form = await request.form()
username, password = form["username"], form["password"]
# 示例:验证用户名密码(实际应查询数据库)
if username == "admin" and password == "securepassword":
request.session["admin_authenticated"] = True
request.session["username"] = username
return True
request.session["login_error"] = "用户名或密码错误"
return False
async def logout(self, request: Request) -> bool:
"""处理登出请求"""
request.session.clear()
return True
async def authenticate(self, request: Request) -> bool:
"""验证用户是否已登录"""
return request.session.get("admin_authenticated", False)
# 添加会话中间件(需在FastAPI应用中配置)
from starlette.middleware.sessions import SessionMiddleware
app.add_middleware(
SessionMiddleware,
secret_key="your-secret-key-here", # 生产环境使用强随机密钥
session_cookie="admin_session",
max_age=None # 浏览器关闭时过期
)
# 设置认证后端
admin.authentication_backend = CustomAuth()
通过重写get_list_value方法自定义列表页单元格内容(如截断长文本):
class UserAdmin(ModelView, model=User):
# ...其他配置...
def get_list_value(self, model: User, name: str):
"""自定义列表显示值"""
if name == "name":
return model.name[:10] + "..." if len(model.name) > 10 else model.name
return super().get_list_value(model, name)
调整分页大小及默认排序规则:
class UserAdmin(ModelView, model=User):
# ...其他配置...
page_size = 20 # 每页显示20条
page_size_options = [10, 20, 50, 100] # 可选分页大小
column_default_sort = [("name", True)] # 默认按name升序排序
通过form_columns指定表单字段,或使用WTForms自定义表单:
from wtforms import StringField, validators
class UserAdmin(ModelView, model=User):
# ...其他配置...
form_columns = ["name", "email"] # 仅显示name和email字段
form_extra_fields = {
"phone": StringField("Phone", validators=[validators.Optional()])
} # 添加额外字段
uvicorn直接开启HTTPS:uvicorn main:app --ssl-keyfile=./key.pem --ssl-certfile=./cert.pem --host 0.0.0.0 --port 443
ufw)限制管理界面端口(默认8000)的访问:sudo ufw allow from 192.168.1.0/24 to any port 8000 # 仅允许内网访问
sudo ufw enable
pip install --upgrade sqladmin fastapi sqlalchemy