关于 python-api-endpoint-creator
为 FastAPI 项目创建分层 REST API 端点的开发技能,面向构建新端点或领域模块的开发者。它按路由、服务、仓储和测试组织脚手架,并规定异步处理与软删除等模式。
主要功能
- 01生成 Pydantic 模式和 SQLAlchemy 模型
- 02搭建异步 CRUD 仓储与服务层
- 03创建依赖项和薄路由
- 04生成 httpx AsyncClient 测试
- 05遵循软删除与响应模式规则
适用场景
- 01从零创建 REST API 端点
- 02为领域实体添加 CRUD 操作
- 03搭建完整分层模块与测试
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ c0x12c/ ai-toolkit --skill python-api-endpoint-creator安装后在 Claude Code 中输入/python-api-endpoint-creator确认已加载。
附带文件code-patterns.md
详细介绍
Python API 端点创建器
按照严格的分层架构模式创建完整的 FastAPI 端点。
适用场景
- 从头开始创建新的 REST API 端点
- 为新的领域实体添加 CRUD 操作
- 搭建完整技术栈:Router → Service → Repository → Tests
- 为新的领域模块搭建脚手架
流程
- Pydantic Schemas — 在
schemas.py中创建 Create/Update/Response - SQLAlchemy Model — 在
models.py中添加 SoftDeleteMixin - Repository — 在
repository.py中实现带软删除的异步 CRUD - Service — 在
service.py中实现业务逻辑,并通过 HTTPException 处理错误 - Dependencies — 在
dependencies.py中定义get_db、get_service - Router — 在
router.py中实现精简端点,所有依赖都使用 Depends() - Tests — 在
tests/中编写 httpx AsyncClient 测试
每个文件的完整模板请参阅 code-patterns.md。
架构
Router (APIRouter) → Service → Repository → Database
↓ ↓ ↓
Depends() Business logic SQLAlchemy
Pydantic schemas HTTPException AsyncSession
Status codes Validation Soft delete
硬性规则
- 所有变更操作都使用 POST — 读取使用 GET,创建/更新/删除使用 POST
- ID 使用查询参数 — 使用
?id=xxx,绝不使用路径参数/{id} - Router 保持精简 — 只负责委派,不包含业务逻辑
- Service 抛出 HTTPException — 用于处理预期错误(404、409、422)
- Repository 处理软删除 — 在所有查询中筛选
deleted_at.is_(None) - 所有端点都使用
async def— CPU 密集型操作除外
注意事项
-
忘记设置
response_model会导致 API 泄露内部字段。 始终为端点设置response_model=YourSchema。否则,FastAPI 会序列化原始返回值,其中可能包含 SQLAlchemy 模型中的hashed_password、deleted_at或其他内部字段。 -
Depends()会为每个请求创建一个新实例,而不是单例。 如果你的 Service 持有状态,这些状态会在请求之间丢失。Service 应保持无状态。如果需要共享状态,请使用 app state 或缓存。 -
在依赖项中执行
await db.commit(),不要在 Repository 中执行。get_db依赖项负责处理提交/回滚。如果还在 Repository 中提交,就会导致重复提交错误,或在所有操作完成前过早提交。 -
Pydantic 默认返回的 422 错误信息不明确。 重写
RequestValidationError处理器,返回字段级错误。默认信息只有“validation error”,无法为前端提供有用的细节。 -
创建端点缺少
status_code=201。 FastAPI 默认返回 200。为 POST 创建路由明确设置status_code=status.HTTP_201_CREATED,并为删除路由设置status_code=status.HTTP_204_NO_CONTENT。