title: 如何用FastAPI和Tortoise-ORM打造一个既高效又灵活的角色管理系统?
date: 2025/06/11 13:18:54
updated: 2025/06/11 13:18:54
author: cmdragon
excerpt:
角色模型设计包含核心字段如唯一标识、角色名称、描述、启用状态和创建时间。权限关联通过多对多关系实现,角色与权限通过中间表关联。完整的CRUD接口包括创建角色、获取角色信息等操作。数据库关系映射实战展示了如何为角色分配权限。常见报错解决方案提供了初始化数据库和处理请求体字段错误的指导。
categories:
tags:
扫描二维码
关注或者微信搜一搜:编程智域 前端至全栈交流与成长
探索数千个预构建的 AI 应用,开启你的下一个伟大创意:https://tools.cmdragon.cn/
(使用FastAPI+Tortoise-ORM完整实现方案)
在权限管理系统中,角色模型需要包含以下核心字段:
# 环境要求: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模式
在角色模型中添加权限关联字段:
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" # 中间表名称
)
创建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
为角色分配权限的完整示例:
@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:当尝试创建重复角色名称时,系统会抛出什么HTTP状态码?
A) 200 B) 400 C) 401 D) 404
答案与解析:B) 400
代码中使用了Role.exists()
检查角色唯一性,当发现重复时会主动抛出400 Bad Request异常,告知客户端请求参数存在问题。
报错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
在创建角色时
Content-Type: application/json
/docs
端点)通过本文实现的角色管理系统,开发者可以快速构建基于RBAC(基于角色的访问控制)的权限体系。实际部署时建议添加以下增强功能:
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
,阅读完整的文章:如何用FastAPI和Tortoise-ORM打造一个既高效又灵活的角色管理系统? | cmdragon's Blog
参与评论
手机查看
返回顶部