如何用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是开源,分布式数据库,旨在帮助开发人员与运营商在打造实时应用时处理无结构数据 如何打造一个伟大 ...
随机推荐
- CNVD挖掘思路
CNVD挖掘思路 CNVD获取条件 首先,先来了解一下目前cnvd发证资格 1.事件型 事件型漏洞必须是三大运营商(移动.联通.电信)的中高危漏洞,或者党政机关.重要行业单位.科研院所.重要企事业单位 ...
- linux生成ssh密钥
前言 我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器.但是,一般的密码方式登录,容易有密码被暴力破解的问题.所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口 ...
- PIL或Pillow学习1
PIL( Python Imaging Library)是 Python 的第三方图像处理库,由于其功能丰富,API 简洁易用,因此深受好评. 自 2011 年以来,由于 PIL 库更新缓慢,目前仅支 ...
- go 语言中的占位符详解
在 Go 语言的 fmt 包中,占位符用于格式化输出,允许在输出时插入变量的值.以下是一些常用的占位符及其用法: 通用占位符: %v:按照值的默认格式输出. %+v:输出结构体时,会添加字段名. %# ...
- 1001: 【编程入门】A+B 输入输出练习I
1001: [编程入门]A+B 输入输出练习I[https://www.cyccfoj.com/problem.php?id=1001] ''' 题目描述 你的任务是计算a+b.这是为了acm初学者专 ...
- 洛谷P4198 楼房重建 题解
Part1.自己一开始是怎么想的 我一开始的想法是先考虑什么情况下是看不见的. 如果是 \(i < j\) 的话可以直接看 \(j\) 的斜率和 \(i\) 的斜率就是比较 \(\frac{h_ ...
- TreeSet的add方法源码分析
一.JDK 1.8 中 TreeSet 的 add 方法源码详细分析 TreeSet 是 Java 集合框架中的一个有序集合类,基于红黑树(TreeMap)实现.TreeSet 的 add 方法用于向 ...
- H5 ios端底部安全距离CSS
html 头部添加 <meta name="viewport" content="width=device-width, initial-scale=1.0,min ...
- MySQL 数据库的性能优化方法有哪些?
MySQL 数据库性能优化是提高数据库响应速度和处理能力的重要手段.性能优化可以从多个层面入手,涵盖数据库设计.查询优化.硬件资源优化.配置调整等方面.以下是 MySQL 数据库常见的性能优化方法: ...
- K8s新手系列之K8s中的资源
K8s中资源的概念 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes. kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓 ...