当前位置: 首页 > news >正文

使用 FastAPI+FastCRUD 快速开发博客后端 API 接口

作者:张大鹏
时间:2025 年 11 月
标签:FastAPI / SQLAlchemy / FastCRUD / 后端开发 / REST API


一、引言

在 FastAPI 项目中,我们通常会手写大量重复的 CRUD 逻辑(Create / Read / Update / Delete)。
例如,一个博客系统的后台往往包括:

  • 用户表(Users)
  • 文章表(Posts)
  • 评论表(Comments)

而每个模型都需要相似的增删改查接口。
这会导致重复的模板式代码 —— 不仅冗余,还容易出错。

于是,我们引入一个强大的自动化工具:FastCRUD

FastCRUD 是一个基于 FastAPI + SQLAlchemy 2.0 的开源库,可以:

  • 🔧 自动生成 CRUD 路由(无需手写重复接口)
  • ⚡ 全异步支持(AsyncSession + async engine)
  • 🔍 内建分页、排序、关联查询(join)
  • 🧩 与 Pydantic 2.x 完美集成

下面我们将用它一步步构建一个简洁高效的博客后端 API


二、项目结构设计

我们将构建以下结构:

fastcrud_blog/
│
├── main.py              # FastAPI 启动入口
├── database.py          # 数据库配置(engine, session)
├── models.py            # SQLAlchemy ORM 模型
├── schemas.py           # Pydantic 模型
├── routers/
│   ├── users.py
│   ├── posts.py
│   └── comments.py
└── requirements.txt

环境要求:

Python >= 3.9
FastAPI >= 0.110
SQLAlchemy >= 2.0
FastCRUD >= 0.1.4

安装依赖:

pip install fastapi[all] sqlalchemy fastcrud pydantic

三、配置数据库

文件:database.py

from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmakerDATABASE_URL = "sqlite+aiosqlite:///./blog.db"engine = create_async_engine(DATABASE_URL, echo=True)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)async def get_session() -> AsyncSession:async with async_session() as session:yield session

四、定义数据模型

文件:models.py

from sqlalchemy.orm import DeclarativeBase, relationship
from sqlalchemy import Column, Integer, String, Text, ForeignKeyclass Base(DeclarativeBase):passclass User(Base):__tablename__ = "users"id = Column(Integer, primary_key=True)username = Column(String(50), unique=True, index=True)email = Column(String(100), unique=True)posts = relationship("Post", back_populates="author")class Post(Base):__tablename__ = "posts"id = Column(Integer, primary_key=True)title = Column(String(200))content = Column(Text)author_id = Column(Integer, ForeignKey("users.id"))author = relationship("User", back_populates="posts")comments = relationship("Comment", back_populates="post")class Comment(Base):__tablename__ = "comments"id = Column(Integer, primary_key=True)content = Column(Text)post_id = Column(Integer, ForeignKey("posts.id"))post = relationship("Post", back_populates="comments")

五、定义 Schema(Pydantic 模型)

文件:schemas.py

from pydantic import BaseModel
from typing import Optional# User Schemas
class UserBase(BaseModel):username: stremail: strclass UserCreate(UserBase):passclass UserUpdate(BaseModel):email: Optional[str] = None# Post Schemas
class PostBase(BaseModel):title: strcontent: strclass PostCreate(PostBase):author_id: intclass PostUpdate(BaseModel):title: Optional[str]content: Optional[str]# Comment Schemas
class CommentBase(BaseModel):content: strclass CommentCreate(CommentBase):post_id: intclass CommentUpdate(BaseModel):content: Optional[str]

六、使用 FastCRUD 自动生成 CRUD 路由

6.1 用户接口

文件:routers/users.py

from fastapi import APIRouter
from fastcrud import crud_router
from models import User
from schemas import UserCreate, UserUpdate
from database import get_sessionuser_router = crud_router(session=get_session,model=User,create_schema=UserCreate,update_schema=UserUpdate,path="/users",tags=["Users"]
)

6.2 文章接口

文件:routers/posts.py

from fastcrud import crud_router
from models import Post
from schemas import PostCreate, PostUpdate
from database import get_sessionpost_router = crud_router(session=get_session,model=Post,create_schema=PostCreate,update_schema=PostUpdate,path="/posts",tags=["Posts"]
)

6.3 评论接口

文件:routers/comments.py

from fastcrud import crud_router
from models import Comment
from schemas import CommentCreate, CommentUpdate
from database import get_sessioncomment_router = crud_router(session=get_session,model=Comment,create_schema=CommentCreate,update_schema=CommentUpdate,path="/comments",tags=["Comments"]
)

七、整合主应用

文件:main.py

from fastapi import FastAPI
from models import Base
from database import engine
from routers.users import user_router
from routers.posts import post_router
from routers.comments import comment_routerapp = FastAPI(title="FastCRUD Blog API")@app.on_event("startup")
async def init_db():async with engine.begin() as conn:await conn.run_sync(Base.metadata.create_all)app.include_router(user_router)
app.include_router(post_router)
app.include_router(comment_router)

启动服务:

uvicorn main:app --reload

打开浏览器访问:

👉 http://127.0.0.1:8000/docs

你将看到自动生成的接口文档,包括:

  • POST /users/ 创建用户
  • GET /users/{id} 获取用户详情
  • POST /posts/ 发布文章
  • GET /comments/ 查看评论

FastCRUD 自动帮你生成了完整的 CRUD 逻辑、路径和 Pydantic 校验。


八、分页、排序与 Join

FastCRUD 的查询接口支持高级参数,例如:

from fastcrud import FastCRUD
from models import Post
from database import get_session
from schemas import PostCreatepost_crud = FastCRUD(Post)@app.get("/posts/paginated")
async def list_posts(limit: int = 10, offset: int = 0, db=Depends(get_session)):return await post_crud.get_multi(db, limit=limit, offset=offset, sort_columns=["id"], sort_orders=["desc"])

支持 offset、cursor 分页与多字段排序,常用于后台文章列表或时间线接口。


九、扩展:加入权限验证

你可以在自动生成的路由外层包一层依赖注入。例如:

from fastapi import Depends, HTTPException
from fastcrud import crud_router
from dependencies import get_current_user  # 你自己定义的 JWT 验证逻辑post_router = crud_router(session=get_session,model=Post,create_schema=PostCreate,update_schema=PostUpdate,path="/posts",tags=["Posts"],dependencies=[Depends(get_current_user)]
)

这样,所有 /posts/* 路径都将自动启用 JWT 验证。


十、总结与实践建议

优点说明
🚀 高开发效率自动生成 CRUD 端点,几乎不用手写基础逻辑
⚙️ 异步性能优秀完美契合 FastAPI 异步架构
🧠 可扩展性强可组合 FastCRUD 与自定义逻辑
📦 易于维护统一 CRUD 模板、简化项目结构

适用场景:

  • 博客系统、管理后台、CMS、企业内部 API
  • 原型验证期快速上线
  • 需要标准化 CRUD 的微服务架构

十一、结语

使用 FastCRUD 开发博客 API,可以让你在几分钟内完成整个后端骨架。
它让我们从繁琐的 CRUD 模板代码中解放出来,专注于业务逻辑与架构设计。

如果你想继续深入,可以考虑在 FastCRUD 基础上:

  • 加入用户权限体系(JWT / OAuth2)
  • 实现软删除、审计字段(created_at / updated_at)
  • 编写自定义查询(如“某用户的热门文章列表”)
http://www.dtcms.com/a/582851.html

相关文章:

  • 网站底部版权信息网页游戏开服表大全
  • 系统运维Day02_数据同步服务
  • 与设计行业相关的网站四川省住房与城乡建设厅网站
  • 深圳市设计网站缪斯设计网站
  • 现在还有做系统的网站吗wordpress摄影主题 lens
  • OLEDB连接对象介绍(一)
  • 【申论】申论基础知识
  • 商务网站建设调研host wordpress
  • 一款AB实验分析智能体是如何诞生的
  • 你的MES系统,是在“记录过去”还是在“指挥未来”?
  • FPGA教程系列-Vivado中串行FIR设计(非FIR核)
  • I2C接口(2):IIC多主设备仲裁机制详解--从原理到Verilog实现
  • 技术网站推广范例怎么建立自己公司的网站
  • 网站的设计公司网咖活动营销方案
  • 北京市朝阳区网站开发公司中国建设监理网站
  • 多语言网站是怎么做的交互设计网站有哪些
  • iis部署网站浏览报404建设网站公司塞尼铁克
  • 使用 PyTorch来构建线性回归的实现
  • 营销型网站设计公司企业网站模板下载服务哪家好
  • 对接物联网使用netty通信与MQTT之间的区别
  • 重塑城市公共安全管理的“智慧之眼”
  • 临海建设局官方网站plc编程入门基础知识
  • 有教做衣服的网站吗免费签名logo设计
  • 2.2.STM32-新建工程
  • 怎么做提卡密网站开发高端市场应该注意
  • 无锡网知名网站教做香肠的网站
  • 做酒招代理的网站江门网红打卡景点蓬江区
  • 双牌网站建设购物网站建设市场调查论文
  • 对象住哪里?——深入剖析 JVM 内存结构与对象分配机制
  • 站长工具高清有吗网推获客平台