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. CNVD挖掘思路

    CNVD挖掘思路 CNVD获取条件 首先,先来了解一下目前cnvd发证资格 1.事件型 事件型漏洞必须是三大运营商(移动.联通.电信)的中高危漏洞,或者党政机关.重要行业单位.科研院所.重要企事业单位 ...

  2. linux生成ssh密钥

    前言 我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器.但是,一般的密码方式登录,容易有密码被暴力破解的问题.所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口 ...

  3. PIL或Pillow学习1

    PIL( Python Imaging Library)是 Python 的第三方图像处理库,由于其功能丰富,API 简洁易用,因此深受好评. 自 2011 年以来,由于 PIL 库更新缓慢,目前仅支 ...

  4. go 语言中的占位符详解

    在 Go 语言的 fmt 包中,占位符用于格式化输出,允许在输出时插入变量的值.以下是一些常用的占位符及其用法: 通用占位符: %v:按照值的默认格式输出. %+v:输出结构体时,会添加字段名. %# ...

  5. 1001: 【编程入门】A+B 输入输出练习I

    1001: [编程入门]A+B 输入输出练习I[https://www.cyccfoj.com/problem.php?id=1001] ''' 题目描述 你的任务是计算a+b.这是为了acm初学者专 ...

  6. 洛谷P4198 楼房重建 题解

    Part1.自己一开始是怎么想的 我一开始的想法是先考虑什么情况下是看不见的. 如果是 \(i < j\) 的话可以直接看 \(j\) 的斜率和 \(i\) 的斜率就是比较 \(\frac{h_ ...

  7. TreeSet的add方法源码分析

    一.JDK 1.8 中 TreeSet 的 add 方法源码详细分析 TreeSet 是 Java 集合框架中的一个有序集合类,基于红黑树(TreeMap)实现.TreeSet 的 add 方法用于向 ...

  8. H5 ios端底部安全距离CSS

    html 头部添加 <meta name="viewport" content="width=device-width, initial-scale=1.0,min ...

  9. MySQL 数据库的性能优化方法有哪些?

    MySQL 数据库性能优化是提高数据库响应速度和处理能力的重要手段.性能优化可以从多个层面入手,涵盖数据库设计.查询优化.硬件资源优化.配置调整等方面.以下是 MySQL 数据库常见的性能优化方法: ...

  10. K8s新手系列之K8s中的资源

    K8s中资源的概念 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes. kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓 ...