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 常见报错解决方案

报错1tortoise.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()

报错2422 Unprocessable Entity 在创建角色时

  • 原因:请求体字段不符合Pydantic模型要求
  • 排查步骤
    1. 检查请求头是否包含Content-Type: application/json
    2. 验证请求体字段是否完整且类型正确
    3. 使用OpenAPI文档进行测试(访问/docs端点)

通过本文实现的角色管理系统,开发者可以快速构建基于RBAC(基于角色的访问控制)的权限体系。实际部署时建议添加以下增强功能:

  1. 添加批量权限分配接口
  2. 实现角色继承机制
  3. 结合JWT进行权限验证
  4. 添加审计日志记录权限变更

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:如何用FastAPI和Tortoise-ORM打造一个既高效又灵活的角色管理系统? | cmdragon's Blog

往期文章归档:

如何用FastAPI和Tortoise-ORM打造一个既高效又灵活的角色管理系统?的更多相关文章

  1. 如何用20行Python代码打造一个微信群聊助手?

    今天要教大家一个黑科技,20行代码实现自己定制的微信群聊助手,可以用来活跃群气氛,好多群主创建完群后,拉完一群人,之后就一片寂静,有个群聊助手,就可以帮忙活跃群里气氛,通过今天在自己的微信上有一大批好 ...

  2. [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)

    一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...

  3. [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一)

    一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...

  4. [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) (转)

    http://www.cnblogs.com/liqingwen/p/6640861.html 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:ht ...

  5. [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office

    打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...

  6. [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统

    一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...

  7. Linux强化论:15步打造一个安全的Linux服务器

    Linux强化论:15步打造一个安全的Linux服务器 Alpha_h4ck2016-11-30共28761人围观 ,发现 8 个不明物体专题系统安全 可能大多数人都觉得Linux是安全的吧?但我要告 ...

  8. 在sublimetext上打造一个兼容virtualenv的web&python开发环境

    利用Sublimetext3&virtualenv 打造一个Web&Python IDE 注: 环境:window|python3;以下使用的sublimetext插件均用packag ...

  9. AngularJs打造一个简易权限系统

    AngularJs打造一个简易权限系统 一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJ ...

  10. RethinkDB创始人教你如何打造一个伟大的互联网产品

    关于作者 我叫Slava Akhmechet,本人是 RethinkDB 的创始人之一,RethinkDB是开源,分布式数据库,旨在帮助开发人员与运营商在打造实时应用时处理无结构数据 如何打造一个伟大 ...

随机推荐

  1. Golang 入门 : 整型

    整型介绍 Go语言同时提供了有符号和无符号类型的整数运算.这里有 int8.int16.int32 和 int64 四种截然不同大小的有符号整形数类型,分别对应 8.16.32.64 bit大小的有符 ...

  2. centos安装php环境

    安装 PHP 所需扩展 yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcur ...

  3. Shader作画

    代码运行网站:http://editor.thebookofshaders.com/ // Author @CuriosityWang // https://www.cnblogs.com/curio ...

  4. Ubuntu截屏工具推荐

    Ubuntu截屏工具推荐 本篇博文推荐Ubuntu下的截屏工具Flameshot,可以作为Windows下Snipaste截图工具的平替. GitHub地址:https://github.com/fl ...

  5. TCP协议详细介绍

    TCP报文格式: 字段介绍: 源/目的端口:用来标识主机上的程序 序号(seq):4个byte,指当前tcp报文段中第一个字节的序号(tcp报文中每个字节都有一个编号) 确认号(ack):4个byte ...

  6. BUUCTF---达芬奇的密码

    题目 达芬奇隐藏在蒙娜丽莎中的数字列:1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2 ...

  7. macOS 和 Windows 操作系统下如何安装和启动 MySQL / Redis 数据库

    你好,我是 Kagol,个人公众号:前端开源星球(欢迎关注我,分享更多前端开源知识). TinyPro 后台管理系统的 NestJS 后端依赖 MySQL 和 Redis 数据库,本文主要带大家安装和 ...

  8. 什么是 Java 中的常量池?

    Java 中的常量池 Java 中的常量池(Constant Pool)是用于存放程序中常量(如字符串.数字.类.方法等)的内存区域.常量池的主要作用是提高内存的使用效率和性能,避免重复创建相同的常量 ...

  9. DPDI(Dispatch PDI)kettle调度管理平台之实操演练第001讲--手工调度本地PDI任务生成日期维度数据

    DPDI实操演练第一讲 1.DPDI简介 DPDI Online 您的智能ETL任务调度专家 DPDI Online 是一款基于Kettle的强大在线任务调度平台,凭借其高效与灵活性,专为调度和监控K ...

  10. CF1370C题解

    本蒟蒻的第二篇题解,找题归功于教练 题目传送门 这道题目找好了规律很简单: 具体思路: 题目大意: 有一个正整数 nnn.两名玩家轮流操作.每次操作可以执行以下一种: 将 nnn 除以一个 nnn 的 ...