如何用FastAPI和Tortoise-ORM打造一个既高效又灵活的角色管理系统?
title: 如何用FastAPI和Tortoise-ORM打造一个既高效又灵活的角色管理系统?
date: 2025/06/11 13:18:54
updated: 2025/06/11 13:18:54
author: cmdragon
excerpt:
角色模型设计包含核心字段如唯一标识、角色名称、描述、启用状态和创建时间。权限关联通过多对多关系实现,角色与权限通过中间表关联。完整的CRUD接口包括创建角色、获取角色信息等操作。数据库关系映射实战展示了如何为角色分配权限。常见报错解决方案提供了初始化数据库和处理请求体字段错误的指导。
categories:
- 后端开发
- FastAPI
tags:
- FastAPI
- Tortoise-ORM
- 角色模型
- 权限管理
- 数据库映射
- CRUD接口
- RBAC

扫描二维码
关注或者微信搜一搜:编程智域 前端至全栈交流与成长
探索数千个预构建的 AI 应用,开启你的下一个伟大创意:https://tools.cmdragon.cn/
1. 角色模型设计与数据库关系映射实现
(使用FastAPI+Tortoise-ORM完整实现方案)
1.1 角色模型基础结构设计
在权限管理系统中,角色模型需要包含以下核心字段:
# 环境要求:Python 3.8+, 安装依赖包
# pip install fastapi==0.78.0 tortoise-orm==0.19.3 pydantic==1.10.7
from tortoise.models import Model
from tortoise import fields
class Role(Model):
# 角色唯一标识
id = fields.IntField(pk=True)
# 角色名称(唯一约束)
name = fields.CharField(max_length=50, unique=True)
# 角色描述信息
description = fields.TextField()
# 是否启用该角色
is_active = fields.BooleanField(default=True)
# 创建时间(自动记录)
created_at = fields.DatetimeField(auto_now_add=True)
class Meta:
table = "auth_roles"
对应的Pydantic模型实现:
from pydantic import BaseModel
from datetime import datetime
class RoleCreate(BaseModel):
name: str
description: str
is_active: bool = True
class RoleResponse(RoleCreate):
id: int
created_at: datetime
class Config:
orm_mode = True # 启用ORM模式
1.2 权限关联设计(多对多关系)
在角色模型中添加权限关联字段:
class Permission(Model):
id = fields.IntField(pk=True)
code = fields.CharField(max_length=100, unique=True) # 权限编码
name = fields.CharField(max_length=50) # 权限名称
class Meta:
table = "auth_permissions"
# 更新角色模型添加关联
class Role(Model):
# ...原有字段保持不变...
permissions = fields.ManyToManyField(
"models.Permission",
related_name="roles",
through="role_permissions" # 中间表名称
)
1.3 完整CRUD接口实现
创建FastAPI路由操作:
from fastapi import APIRouter, HTTPException
router = APIRouter(prefix="/roles", tags=["角色管理"])
@router.post("", response_model=RoleResponse)
async def create_role(role: RoleCreate):
# 检查角色是否存在
if await Role.exists(name=role.name):
raise HTTPException(400, "角色已存在")
# 创建新角色
role_obj = await Role.create(**role.dict())
return await RoleResponse.from_tortoise_orm(role_obj)
@router.get("/{role_id}", response_model=RoleResponse)
async def get_role(role_id: int):
role = await Role.get_or_none(id=role_id).prefetch_related("permissions")
if not role:
raise HTTPException(404, "角色不存在")
return role
1.4 数据库关系映射实战
为角色分配权限的完整示例:
@router.post("/{role_id}/permissions")
async def assign_permission(role_id: int, permission_id: int):
role = await Role.get_or_none(id=role_id)
permission = await Permission.get_or_none(id=permission_id)
if not (role and permission):
raise HTTPException(404, "角色或权限不存在")
# 添加关联关系
await role.permissions.add(permission)
return {"msg": "权限分配成功"}
执行创建请求示例:
curl -X POST http://localhost:8000/roles \
-H "Content-Type: application/json" \
-d '{"name":"admin","description":"系统管理员"}'
1.5 课后Quiz
问题1:当尝试创建重复角色名称时,系统会抛出什么HTTP状态码?
A) 200 B) 400 C) 401 D) 404
答案与解析:B) 400
代码中使用了Role.exists()检查角色唯一性,当发现重复时会主动抛出400 Bad Request异常,告知客户端请求参数存在问题。
1.6 常见报错解决方案
报错1:tortoise.exceptions.OperationalError: no such table: auth_roles
- 原因:数据库未正确初始化
- 解决方案:
# 在应用启动时添加初始化代码
from tortoise import Tortoise
async def init_db():
await Tortoise.init(
db_url='sqlite://db.sqlite3',
modules={'models': ['your_module']} # 替换为实际模型所在模块
)
await Tortoise.generate_schemas()
报错2:422 Unprocessable Entity 在创建角色时
- 原因:请求体字段不符合Pydantic模型要求
- 排查步骤:
- 检查请求头是否包含
Content-Type: application/json - 验证请求体字段是否完整且类型正确
- 使用OpenAPI文档进行测试(访问
/docs端点)
- 检查请求头是否包含
通过本文实现的角色管理系统,开发者可以快速构建基于RBAC(基于角色的访问控制)的权限体系。实际部署时建议添加以下增强功能:
- 添加批量权限分配接口
- 实现角色继承机制
- 结合JWT进行权限验证
- 添加审计日志记录权限变更
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:如何用FastAPI和Tortoise-ORM打造一个既高效又灵活的角色管理系统? | cmdragon's Blog
往期文章归档:
- JWT令牌如何在FastAPI中实现安全又高效的生成与验证? | cmdragon's Blog
- 你的密码存储方式是否在向黑客招手? | cmdragon's Blog
- 如何在FastAPI中轻松实现OAuth2认证并保护你的API? | cmdragon's Blog
- FastAPI安全机制:从OAuth2到JWT的魔法通关秘籍 | cmdragon's Blog
- FastAPI认证系统:从零到令牌大师的奇幻之旅 | cmdragon's Blog
- FastAPI安全异常处理:从401到422的奇妙冒险 | cmdragon's Blog
- FastAPI权限迷宫:RBAC与多层级依赖的魔法通关秘籍 | cmdragon's Blog
- JWT令牌:从身份证到代码防伪的奇妙之旅 | cmdragon's Blog
- FastAPI安全认证:从密码到令牌的魔法之旅 | cmdragon's Blog
- 密码哈希:Bcrypt的魔法与盐值的秘密 | cmdragon's Blog
- 用户认证的魔法配方:从模型设计到密码安全的奇幻之旅 | cmdragon's Blog
- FastAPI安全门神:OAuth2PasswordBearer的奇妙冒险 | cmdragon's Blog
- OAuth2密码模式:信任的甜蜜陷阱与安全指南 | cmdragon's Blog
- API安全大揭秘:认证与授权的双面舞会 | cmdragon's Blog
- 异步日志监控:FastAPI与MongoDB的高效整合之道 | cmdragon's Blog
- FastAPI与MongoDB分片集群:异步数据路由与聚合优化 | cmdragon's Blog
- FastAPI与MongoDB Change Stream的实时数据交响曲 | cmdragon's Blog
- 地理空间索引:解锁日志分析中的位置智慧 | cmdragon's Blog
- 异步之舞:FastAPI与MongoDB的极致性能优化之旅 | cmdragon's Blog
- 异步日志分析:MongoDB与FastAPI的高效存储揭秘 | cmdragon's Blog
- MongoDB索引优化的艺术:从基础原理到性能调优实战 | cmdragon's Blog
- 解锁FastAPI与MongoDB聚合管道的性能奥秘 | cmdragon's Blog
- 异步之舞:Motor驱动与MongoDB的CRUD交响曲 | cmdragon's Blog
- 异步之舞:FastAPI与MongoDB的深度协奏 | cmdragon's Blog
- 数据库迁移的艺术:FastAPI生产环境中的灰度发布与回滚策略 | cmdragon's Blog
- 数据库迁移的艺术:团队协作中的冲突预防与解决之道 | cmdragon's Blog
- 驾驭FastAPI多数据库:从读写分离到跨库事务的艺术 | cmdragon's Blog
- 数据库事务隔离与Alembic数据恢复的实战艺术 | cmdragon's Blog
- FastAPI与Alembic:数据库迁移的隐秘艺术 | cmdragon's Blog
- 飞行中的引擎更换:生产环境数据库迁移的艺术与科学 | cmdragon's Blog
- Alembic迁移脚本冲突的智能检测与优雅合并之道 | cmdragon's Blog
- 多数据库迁移的艺术:Alembic在复杂环境中的精妙应用 | cmdragon's Blog
- 数据库事务回滚:FastAPI中的存档与读档大法 | cmdragon's Blog
- Alembic迁移脚本:让数据库变身时间旅行者 | cmdragon's Blog
- 数据库连接池:从银行柜台到代码世界的奇妙旅程 | cmdragon's Blog
- XML Sitemap
如何用FastAPI和Tortoise-ORM打造一个既高效又灵活的角色管理系统?的更多相关文章
- 如何用20行Python代码打造一个微信群聊助手?
今天要教大家一个黑科技,20行代码实现自己定制的微信群聊助手,可以用来活跃群气氛,好多群主创建完群后,拉完一群人,之后就一片寂静,有个群聊助手,就可以帮忙活跃群里气氛,通过今天在自己的微信上有一大批好 ...
- [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)
一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一)
一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) (转)
http://www.cnblogs.com/liqingwen/p/6640861.html 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:ht ...
- [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office
打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...
- [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统
一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...
- Linux强化论:15步打造一个安全的Linux服务器
Linux强化论:15步打造一个安全的Linux服务器 Alpha_h4ck2016-11-30共28761人围观 ,发现 8 个不明物体专题系统安全 可能大多数人都觉得Linux是安全的吧?但我要告 ...
- 在sublimetext上打造一个兼容virtualenv的web&python开发环境
利用Sublimetext3&virtualenv 打造一个Web&Python IDE 注: 环境:window|python3;以下使用的sublimetext插件均用packag ...
- AngularJs打造一个简易权限系统
AngularJs打造一个简易权限系统 一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJ ...
- RethinkDB创始人教你如何打造一个伟大的互联网产品
关于作者 我叫Slava Akhmechet,本人是 RethinkDB 的创始人之一,RethinkDB是开源,分布式数据库,旨在帮助开发人员与运营商在打造实时应用时处理无结构数据 如何打造一个伟大 ...
随机推荐
- ADO.NET中SQL绑定变量方式总结
最近在项目上遇到几个问题,关于ADO.NET中SQL绑定变量 总结一下,分享给大家. 1. 使用 SqlParameter(推荐方式,防止 SQL 注入) ADO.NET 提供 SqlParamete ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(10)
1.问题描述: 离线推送,锁屏的时候没有弹出消息,只有下拉在通知中心里面显示.请问是否是正常的? 解决方案: 检查一下是否存在图片风控:https://developer.huawei.com/con ...
- C++判断文本编码
#include <iostream> #include <fstream> #include <string> #include <sstream> ...
- Swarm集群部署、集群架构、集群管理 、服务管理
一.部署swarm集群 #docker swarm简介 Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose ...
- Linux上安装配置InstantClient及64位系统Pl/SQL配置
1.首先到官网下载文件:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html?ssS ...
- Linux脚本-使用jar自动替换配置文件
背景 最近公司需要在生产服务器上测试字库,需要非常频繁修改配置文件中的字体相关属性,然后实时调试,所以需要频繁的修改配置文件并手动发布出去.之前需要修改配置文件时,我们需要: 把jar包通过FTP传回 ...
- Lambda表达式--java进阶day03
1.Lambda表达式 2.Lambda表达式格式 ()放我们要重写的方法的形参,{}放我们要写的逻辑 show()没有形参,所以空着,我们将打印语句写入{}中 如图,匿名内部类和Lambda都出现了 ...
- 【错误解决】Android APK 方法数量限制
错误:# Cannot fit requested classes in a single dex file (# methods: 74519 > 65536) 最近开发安卓程序遇到以下错误: ...
- Try .NET & Github Gist
Try .NET Try .NET 是微软最近推出的在线 C# 运行环境,不用安装 Visual Studio 等,就可以直接上手写 C# 代码. 可以先进来写两行代码看看 https://try.d ...
- DRAM的读写操作、刷新、恢复的原理
这一节湖科大教书匠讲得特别好,原理梳理的很清晰,建议去b站看一看 写这个只为了自己复习方便一点 对读操作会破坏数据的理解 预充电利用列线上的寄生电容,使得每列的电压保持在\(Vcc/2\) 进行读操作 ...