Sqladmin - FastAPI框架下一键生成管理后台

介绍

Github 开源地址:

https://github.com/aminalaee/sqladmin

网站说明链接地址:

https://aminalaee.dev/sqladmin/

一个现代、优雅的 SQLAlchemy 管理后台工具,非常适合用在 FastAPI 项目中

SQLAdmin 是一个基于 FastAPI + SQLAlchemy 构建的管理后台框架,灵感来自于 Django Admin,目标是为 Python 项目提供:

• 🚀 简洁易用的后台界面

• 📋 基于 SQLAlchemy 的模型自动管理

• ⚙️ 快速 CRUD(增删改查)

• ✨ Jinja2 渲染漂亮的 Bootstrap 风格后台

功能描述
🎨 UI基于 Tabler(Bootstrap 风格)构建
🔁 CRUD 自动化自动根据模型生成增删改查
🔍 搜索 / 过滤表字段搜索、过滤支持
🧩 多数据库支持支持 SQLite、PostgreSQL、MySQL 等
🔐 自定义认证可扩展自定义登录(如你用的 AdminAuth)
🧠 异步支持与 FastAPI 完美配合,支持异步视图
🔧 高度可配置支持列隐藏、格式化、标签等配置项

支持models 的类型:

✅ 支持 SQLAlchemy 吗?是,必须基于 SQLAlchemy ORM 模型
✅ 支持 SQLAlchemy 1.x 吗?
✅ 支持 SQLAlchemy 2.x 吗?是,从 sqladmin 0.15.0+ 开始全面支持
❌ 支持 Tortoise ORM 吗?不支持
❌ 支持 Django ORM 吗?不支持

为什么使用?

很多项目都是异步,而异步里面ORM 性能最好的就是 SQLAlchemy 2.0

特性优势是否推荐
✅ 新的 2.0 风格语法更清晰、类型安全,统一 async / sync 用法强烈推荐
✅ 原生异步支持(async_engine)适配 FastAPI、aiohttp 等异步框架
✅ Declarative Mapping 更加清晰不再混用 Base = declarative_base() 和 mapper()
✅ 更强的类型提示支持IDE 友好,调试更舒服
✅ Session 语义改进显式事务控制、更加安全
✅ 官方长期维护方向所有新功能只在 2.x 上更新
特性 / 框架SQLAlchemy 2.0 (async)Tortoise ORMasyncpg (原生驱动)
⭐ 异步支持✅ 原生 async API(2.0 起)✅ 原生 async✅ 原生 async
🎯 ORM 支持✅ 完整 ORM(经典 + 声明式)✅ 类 Django 的 ORM❌ 没有 ORM,需手写 SQL
⚙️ 事务处理✅ async with session.begin()✅ transaction() 上下文✅ 需手动写 SQL + 事务处理
🔧 灵活性✅ 高(支持 ORM + Core)中等(ORM风格较固定)极高(最贴近 SQL)
📚 学习曲线稍高(但文档全)较低,适合 Django 用户中等(需掌握 SQL)
🚀 性能优(合理用 async)优(轻量)最优(直接操作 protocol)
✅ 类型支持✅ Pydantic 配合良好✅ 也能配合 Pydantic 使用❌ 无自动转换,手动处理
🧩 支持的数据库多(PostgreSQL, MySQL, SQLite等)PostgreSQL、MySQL、SQLitePostgreSQL 专用
🔍 社区 & 文档非常成熟(官方长期维护)活跃,偏小众官方是 PostgreSQL 的推荐驱动
你的需求推荐方案
需要强大的 ORM + 类型检查 + 可扩展性SQLAlchemy 2.0 + Async
想快速上手、有 Django ORM 背景Tortoise ORM
要极致性能,手写 SQL 不怕麻烦asyncpg

结合应用

from sqlalchemy import Column, Integer, String, create_engine,Enum as SAEnum,JSON
from sqladmin.authentication import AuthenticationBackend
import json
import hashlib
from sqlalchemy import eventfrom sqlalchemy.orm import declarative_base
from enum import Enum
from sqlalchemy.ext.hybrid import hybrid_propertyBase = declarative_base()
engine = create_engine("sqlite:///example.db",connect_args={"check_same_thread": False},
)# 定义枚举类型
class GenderEnum(str, Enum):MALE = "male"FEMALE = "female"OTHER = "other"class User(Base):__tablename__ = "users"id = Column(Integer, primary_key=True)name = Column(String)gender = Column(SAEnum(GenderEnum), nullable=False, comment="性别")password = Column("password", String, nullable=False)  # 真实存储加密后的密码class JsonConfig(Base):__tablename__ = "json_config"id = Column(Integer, primary_key=True)name = Column(String)config = Column(JSON)Base.metadata.create_all(engine)  # Create tables,后面改了字段需要删除from fastapi import FastAPI
from sqladmin import Admin, ModelView
from fastapi import Requestapp = FastAPI()class AdminAuth(AuthenticationBackend):async def login(self, request: Request) -> bool:form = await request.form()username, password = form["username"], form["password"]# Validate username/password credentials# And update sessionif username == "admin" and password == "123456":request.session.update({"sqladmin_token": "..."})return Trueelse:return Falsereturn Trueasync def logout(self, request: Request) -> bool:# Usually you'd want to just clear the sessionrequest.session.clear()return Trueasync def authenticate(self, request: Request) -> bool:token = request.session.get("sqladmin_token")if not token:return False# Check the token in depthreturn Trueauthentication_backend = AdminAuth(secret_key="secret_key")admin = Admin(app, engine,base_url="/super",authentication_backend=authentication_backend)class UserAdmin(ModelView, model=User):self_md5_salt = "123456"column_list = [User.id, User.name,User.gender,User.password]# 自定义列标签(让 SQLAdmin UI 显示中文)column_labels = {"id": "用户 ID","name": "姓名","gender": "性别","password": "密码",}async def insert_model(self, request: Request, data: dict):"""拦截插入逻辑,确保 `password` 经过 MD5 加密"""raw_password = data.pop("password", None)if raw_password:data["password"] = hashlib.md5((raw_password+self.self_md5_salt).encode()).hexdigest()return await super().insert_model(request, data)async def update_model(self, request: Request, pk: str, data: dict):"""拦截更新逻辑,确保 `password` 经过 MD5 加密"""raw_password = data.pop("password", None)if raw_password:data["password"] = hashlib.md5((raw_password+self.self_md5_salt).encode()).hexdigest()return await super().update_model(request, pk, data)class JsonConfigAdmin(ModelView, model=JsonConfig): column_list = [JsonConfig.id, JsonConfig.name,JsonConfig.config]# 前端页面插入的时候 只能使用双引号的json 不能使用单引号的jsonadmin.add_view(UserAdmin)
admin.add_view(JsonConfigAdmin)if __name__ == "__main__":import uvicornuvicorn.run(app, host="127.0.0.1", port=8000)
# uvicorn test_sqladmin:app --host 127.0.0.1 --port 8000 --reload
# 后台地址: http://127.0.0.1:8000/super# pip install itsdangerous  sqladmin 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39673.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习PyTorch之动态计算图可视化 - 使用 torchviz 生成计算图

序号系列文章1深度学习训练中GPU内存管理2深度学习PyTorch之数据加载DataLoader3深度学习 PyTorch 中 18 种数据增强策略与实现4深度学习pytorch之简单方法自定义9类卷积即插即用5深度学习PyTorch之13种模型精度评估公式及调用方法6深度学习pytorch之4种归一化方法(…

ZW3D二次开发_非模板表单_输入框类控件_逐字符回调

ZW3D的非模板表单的控件中有一些输入框类的控件,比如“ZsCc::LineEditBtn”,"ZsCc::LineEditEx"等,按照“ZW3D二次开发_非模板表单_控件_添加回调-CSDN博客”介绍的方法添加函数命令时,发现输入框在用户输入字符时不能动态地触发回…

Mysql--日志(错误日志、二进制日志、查询日志、慢查询日志)

四种日志对比总结 日志类型作用记录内容特点常见用途错误日志记录 MySQL 运行过程中的错误、警告及启动、关闭信息MySQL 系统错误、故障信息、警告等较少占用磁盘空间故障排查、系统监控二进制日志记录所有更改数据库数据的操作及事务执行情况DML、DDL 操作,不记录…

AI对软件工程(software engineering)的影响在哪些方面?

AI对软件工程(software engineering)的影响是全方位且深远的,它不仅改变了传统开发流程,还重新定义了工程师的角色和软件系统的构建方式。以下是AI影响软件工程的核心维度: 一、开发流程的智能化重构 需求工程革命 • …

ElementPlus 快速入门

目录 前言 为什么要学习 ElementPlus? 正文 步骤 1 创建 一个工程化的vue 项目 ​2 安装 element-Plus :Form 表单 | Element Plus 1 点击 当前界面的指南 2 点击左边菜单栏上的安装,选择包管理器 3 运行该命令 demo(案例1 ) 步骤 …

stable diffusion本地安装

1. 基本环境准备 安装conda 环境 pytorch基础学习-CSDN博客 创建虚拟环境: conda create -n sd python3.10 一定要指定用3.10,过高的版本会提示错误: 激活启用环境: conda activate sd 设置pip国内镜像源: pip conf…

使用 Go 构建 MCP Server

一个互联网技术玩家,一个爱聊技术的家伙。在工作和学习中不断思考,把这些思考总结出来,并分享,和大家一起交流进步。 一、MCP 介绍 1. 基本介绍 MCP(Model Context Protocol,模型上下文协议)是…

Python----计算机视觉处理(Opencv:模板匹配)

一、 概念 模板匹配就是用模板图(通常是一个小图)在目标图像(通常是一个比模板图大的图片)中不断的滑动 比较,通过某种比较方法来判断是否匹配成功。 二、应用场景 1. 目标检测与识别:在计算机视觉领域&am…

【stm32】用从模式控制器 完成PWM的测量

🌞学习视频还是来自于 铁头山羊 🌿主要是回顾一下他讲的这一章的定时器的部分,具体的话 还是看一下具体铁头山羊的视频,讲的很清楚~~ 整体流程是这样的,首先通过定时器的输出比较功能,配置好PA6产生一个特定…

【C#】CS学习之Modbus通讯

摘要 本文详细描述了如何在在C#的Winform应用程序中使用NModbus库实现Modbus通讯,包括读取保持寄存器、以及相应的UI界面设计和事件处理。 前言 ​应用场景 Modbus 从站广泛应用于工业自动化领域: 1、传感器数据采集(如温度、压力等&#xf…

Pycharm社区版创建Flask项目详解

一、创建工程项目 二、配置工程目录 新建的空项目下创建目录。 1、新建app.py文件 2、app.py代码如下: from flask import Flask, render_templateapp Flask(__name__)app.route("/") def root():"""主页:return: Index.html"&qu…

Linux 基础入门操作 第十二章 TINY Web 服务器

1 服务器基础架构 1.1 背景知识 Web 服务器使用 HTTP 协议与客户端(即浏览器)通信,而 HTTP 协议又基于 TCP/IP 协议。因此我们要做的工作就是利用 Linux 系统提供的 TCP 通信接口来实现 HTTP 协议。 而 Linux 为我们提供了哪些网络编程接口…

RAG优化:python从零实现[吃一堑长一智]循环反馈Feedback

本文将介绍一种有反馈循环机制的RAG系统,让当AI学会"吃一堑长一智",给传统RAG装了个"后悔"系统,让AI能记住哪些回答被用户点赞/拍砖,从此告别金鱼记忆: 每次回答都像在玩roguelike:失败结局会强化下次冒险悄悄把优质问答变成新知识卡牌,实现"以…

基于SpringBoot的名著阅读网站

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

[AI建模] 使用Pinokio本地化部署混元2D到3D AI建模服务

近年来,AI驱动的2D转3D建模技术发展迅猛,而Pinokio作为一个强大的AI模型管理与部署平台,使得在本地部署这些复杂的AI模型变得更加简单高效。本文将介绍如何使用Pinokio在本地部署混元2D到3D AI建模服务,并快速生成带或不带Texture的3D模型。 1. 在Pinokio Discover页面找到…

Qt 导入TagLib库

文章目录 0. 前言和环境介绍1. 下载TagLib2. 下载zlib3. 修改.pro文件4. 测试代码 0. 前言和环境介绍 最近在使用Qt写一个播放器,需要解析mp3文件,于是研究了一下如何导入TagLib库 Qt构建套件:Desktop Qt6.8.2 MinGW64-bit Qt Creator安装目录: D:\bit…

【前端面试题】计算机网络相关

总结面试前端过程可能会问到的计算机网络相关知识点 1.HTTP和HTTPS的区别 (1)HTTPS HTTP 安全加密 HTTPS 是 HTTP 的 加密版,通过 SSL/TLS 保障数据安全,防止窃听和篡改。 (2)HTTPS 如何保护数据&…

【RabbitMQ高级特性】消息确认机制、持久化、发送方确认、TTL和死信队列

🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、消息确认机制 消费者确认机制确保消息被正确处理后才从队列中删除。如果消费者处理失败(如业务异常或宕机),Broker 会重新投递消息…

调用百度api实现语音识别(python)

该代码实现了一个企业级的语音识别解决方案,通过调用百度语音识别API,实现实时录音识别和对已有音频语音识别功能。 百度智能云:请自行访问百度智能云,开通免费的语音识别功能,获取API_KEY和SECRET_KEY。操作按照百度流程即可,可免费申请。 首先,配置下百度API和描述下错…

Python实现小红书app版爬虫

简介:由于数据需求的日益增大,小红书网页版已经不能满足我们日常工作的需求,为此,小编特地开发了小红书手机版算法,方便大家获取更多的数据,提升工作效率。 手机版接口主要包括:搜素&#xff0…