news 2026/9/30 20:47:22

FastAPI实战笔记(一) 基本介绍与简单操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FastAPI实战笔记(一) 基本介绍与简单操作

一、基本介绍

基础定义

业界常用开发模型

  • /src目录:存放核心应用代码。其下可细分多个子模块:
    • models子目录:存放数据库模型定义
    • routes子目录:管理FastAPI路由配置
    • services子目录:封装业务逻辑层
  • /tests目录:将测试代码与主应用隔离,便于测试管理并确保生产构建不包含测试代码
  • /docs目录:集中存放API文档、安装指南及使用说明等关键文档资源

异步兼容

# 异步函数应仅用于I/O密集型操作(数据库查询、HTTP请求等)@app.get("/")asyncdefread_root():return{"Hello":"World"}

端点

端点是API交互的接入点。在FastAPI中,通过HTTP方法装饰器(如@app.get("/"))创建端点,表示应用根路径的GET请求处理器:

fromfastapiimportFastAPI app=FastAPI()# 当向根URL("/")发起GET请求时,read_root函数被调用并返回JSON响应@app.get("/")asyncdefread_root():return{"Hello":"World"}

路由

当需要管理跨文件的多个端点时,路由机制尤为重要。路由将端点分组到不同模块,大幅提升代码可维护性与可读性(例如:用户操作路由与产品操作路由分离)。

# 创建路由 router_example.pyfromfastapiimportAPIRouter router=APIRouter()@router.get("/items/{item_id}")asyncdefread_item(item_id:int):return{"item_id":item_id}
# 挂载路由 main.py# 路由模块应遵循单一职责原则,按业务域垂直拆分importrouter_examplefromfastapiimportFastAPI app=FastAPI()app.include_router(router_example.router)@app.get("/")asyncdefread_root():return{"Hello":"World"}
uvicorn main:app --reload#--reload参数使服务器在代码变更后自动重启,是开发环境的理想选择# 生产环境则应使用--workers参数配置多进程uvicorn main:app --reload --host192.168.31.158# 限制运行在特定的IP
http://127.0.0.1:8000 http://127.0.0.1:8000/docs http://127.0.0.1:8000/redoc

书店系统案例

后端雏形

# 书店系统后端雏形fromfastapiimportFastAPI app=FastAPI()# {book_id}是路径参数 用来动态传递值@app.get("/books/{book_id}")# book_id: int 执行了数据验证 防御常见注入攻击asyncdefread_book(book_id:int):return{"book_id":book_id,"title":"The Great Gatsby","author":"F. Scott Fitzgerald"}

[!NOTE]

RESTful API 资源标识规范

  1. REST 是面向资源的,路径应表示资源,而不是操作。
  • 不推荐:/getBook/{id}、/deleteUser/{userId}
  • 推荐:/books/{book_id}、/users/{user_id}

路径本身表示资源集合(/books)或具体资源(/books/123),操作由 HTTP 方法(GET/POST/PUT/DELETE)表达。

  1. 使用小写、下划线或短横线分隔(推荐短横线-)

推荐:/books/{book-id}或直接/books/{id}

  1. 路径参数名应简洁,避免冗余

既然路径已经是/books/...,那么参数名无需重复 “book”:

  • 冗余:/books/{book_id}
  • 简洁:/books/{id}

这是 RESTful 设计中的通用惯例。例如 GitHub API 使用:/repos/{owner}/{repo},而不是/repo/{repo_owner}/{repo_name}。

  1. 使用复数形式表示资源集合
  • /books(资源集合)
  • /books/123(具体资源实例)
  1. 标识符应为不透明的(opaque)且稳定
  • 使用数据库主键(如整数123)或全局唯一 ID(如 UUIDa1b2c3d4)。
  • 不应暴露内部结构(如/books/user123_book456)。
  • 一旦分配,不应改变(避免破坏链接)。

参数处理

# 路径参数适用于资源标识(如/users/{user_id})# 新增路径参数端点 用于检索作者信息@app.get("/authors/{author_id}")# 通过Python类型提示(author_id: int)自动执行参数验证与转换asyncdefread_author(author_id:int):return{"author_id":author_id,"name":"Ernest Hemingway"}
  1. 查询参数用于细化或定制API端点的响应,以问号(?)后追加的形式出现在URL中。例如,/books?genre=fiction&year=2010可能仅返回2010年出版的虚构类书籍。

为现有端点添加查询参数。假设我们需要允许用户按出版年份过滤书籍:

# 查询参数适用于资源过滤(如?status=active`)和分页控制(如?page=2&size=10),以问号(?)后追加的形式出现在URL中# 例如 /books?genre=fiction&year=2010# 添加查询参数@app.get("/books")# 此时year可选,None明确表示参数可缺失asyncdefread_books(year:int=None):ifyear:return{"year":year,"books":["Book 1","Book 2"]}return{"books":["All Books"]}

模型定义

基础模型
frompydanticimportBaseModelclassBook(BaseModel):# 每个字段都有类型声明title:strauthor:stryear:int
请求体
# 定义请求体frommodelsimportBook# Pydantic模型也用于请求体的结构定义# 当用户向 /book 发送包含JSON数据的POST请求时,FastAPI会自动解析并验证数据是否符合Book模型。若数据无效,将返回自动化的错误响应@app.post("/book")asyncdefcreate_book(book:Book):returnbook
# 高级验证功能frompydanticimportBaseModel,FieldclassBook(BaseModel):# 最小长度1个字符 最大长度100 个字符title:str=Field(...,min_length=1,max_length=100)author:str=Field(...,min_length=1,max_length=50)# 大于1900 小于2100year:int=Field(...,gt=1900,lt=2100)
响应模型
frompydanticimportBaseModel# 定义响应模型# 响应模型分离设计遵循最小权限原则,避免意外泄露敏感字段classBookResponse(BaseModel):title:strauthor:str# /allbooks GET端点需要返回图书列表,但仅包含书名和作者@app.get("/allbooks")# list[BookResponse] 表示使用BookResponse模型处理响应 保证响应只有两个属性asyncdefread_all_books()->list[BookResponse]:return[{"title":"1984","author":"George Orwell"},{"title":"The Great Gatsby","author":"F. Scott Fitzgerald"},]
# 在端点装饰器参数中指定响应类型# response_model参数具有更高优先级@app.get("/allbooks",response_model=list[BookResponse])asyncdefread_all_books():# 端点实现内容

异常处理

Http错误处理
fromfastapiimportFastAPI,HTTPExceptionfromstarlette.responsesimportJSONResponse# http_exception_handler函数将处理所有`HTTPException`错误。@app.exception_handler(HTTPException)asyncdefhttp_exception_handler(request,exc):returnJSONResponse(status_code=exc.status_code,content={"message":"Oops! Something went wrong"},)
# 测试用端点 显式抛出HTTP错误响应@app.get("/error_endpoint")asyncdefraise_exception():raiseHTTPException(status_code=400)
验证错误处理
importjsonfromfastapiimportRequest,statusfromfastapi.exceptionsimportRequestValidationErrorfromfastapi.responsesimportPlainTextResponse# 捕获所有RequestValidationError错误 并返回包含错误详情的纯文本响应@app.exception_handler(RequestValidationError)asyncdefvalidation_exception_handler(request:Request,exc:RequestValidationError):returnPlainTextResponse("This is a plain text response:"f" \n{json.dumps(exc.errors(),indent=2)}",status_code=status.HTTP_400_BAD_REQUEST,)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 8:55:49

为什么你学了很多却依然做不好决策?

认知提升:突破思维边界,重塑你的世界观在信息爆炸的时代,我们每天都被海量数据包围——短视频、新闻推送、社交媒体、知识付费课程……获取信息从未如此便捷。根据中国互联网络信息中心(CNNIC)2024年发布的第53次《中国…

作者头像 李华
网站建设 2026/9/29 8:55:49

从0基础到完全掌握AD 第11讲 属性面板与原理图尺寸修改

我们今天开始讲原理图的部分,但是我们要讲一个问题,当我们在工作中需要画原理图的时候,我们是先要画原理图库的,就是起码你的库里得有这个元器件才能有原理图,那我们今天为什么先讲原理图呢?因为其实原理图…

作者头像 李华
网站建设 2026/9/30 19:34:17

RyTuneX(Win1011系统优化工具)

RyTuneX是一款专为Windows 10和Windows 11系统打造的系统优化工具,基于WinUI 3框架构建,旨在帮助用户优化系统资源,提升设备性能,同时增强隐私保护。 软件功能 系统优化:支持一键性能调整,可禁用Superfetc…

作者头像 李华
网站建设 2026/9/30 15:00:20

探寻户外发光字行业标杆:解读济南鑫中标的专业解决方案

在商业展示的视觉战场上,户外门头发光字无疑是吸引顾客目光的第一利器。无论企业品牌打造、网红店铺引流,还是临时展位宣传,优质的发光字不仅能传递商业信息,更能成为街道景观的艺术符号。口碑认证的专业服务商:鑫中标…

作者头像 李华
网站建设 2026/9/29 3:38:45

计算机毕业设计springboot基于协同过滤算法的旅游推荐系统 SpringBoot 驱动的个性化旅程发现平台:融合协同过滤的智慧推荐引擎 基于用户兴趣聚类的 SpringBoot 旅游行程智能

计算机毕业设计springboot基于协同过滤算法的旅游推荐系统hcgg8585 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 当“说走就走”成为年轻人的口头禅,面对海量却雷…

作者头像 李华
网站建设 2026/9/29 13:31:03

LSTM量化交易策略的环境适应性与入参稳定性评估

功能说明与风险警示 本文实现的LSTM量化交易策略通过时间序列建模捕捉金融数据的非线性特征,核心功能包括:1)基于历史价格序列构建特征工程;2)采用多层LSTM网络学习时序依赖关系;3)输出未来价格…

作者头像 李华