FastAPI 入门:查询参数、请求体与接口调试

这是我学 FastAPI 时整理的入门笔记。FastAPI 是现在最流行的 Python 后端框架之一,我用它完整走了一遍「写接口 → 启动服务 → 测试 → 读懂报错」的闭环。 一句话总结它的本质: 用 Python 写「后端接口(API)」的框架,靠类型注解自动帮你校验数据、生成文档。 下面按我实际学习的顺序展开。 一、FastAPI 是什么 先拆解几个词: 后端接口(API):你刷新页面、点开 App 时,背后有个服务器在「收到请求 → 处理 → 返回数据」。写这个逻辑就是写后端,对外的"窗口"就是 API。 框架(framework):别人提前搭好的脚手架,你只填业务逻辑,不用从零造轮子。 类比:你开餐厅,FastAPI 就是已经装修好的厨房——灶台水管都通了,你只管炒菜。 它这几年特别火,三个杀手锏: 快:性能在 Python 框架里数一数二(基于异步 asyncio)。 自动生成交互式文档:写完代码自动给你一个能点击测试的网页。 自动校验数据:声明字段类型,传错自动报错,不用手写校验。 对新手尤其友好:它强依赖 Python 类型提示,学它的同时 Python 基本功也会变扎实。 二、最小可运行例子 from fastapi import FastAPI app = FastAPI() # 创建一个"应用"实例 @app.get("/") # 当有人 GET 访问根路径 "/" 时... def read_root(): return {"hello": "world"} # ...就返回这个 JSON 逐行看: 代码 人话解释 app = FastAPI() 开张,建一个 app @app.get("/") 装饰器:下面这个函数负责处理 GET 访问 / 的请求 def read_root() 真正干活的函数 return {...} 返回的字典会被自动转成 JSON 发出去 三、接收数据的三件套 写接口的核心就是「怎么接收别人传来的数据」。FastAPI 有三种方式。 ...

4 min · 653 words · Jiaju

FastAPI 响应模型与请求体学习笔记

这篇是我接着上次学 FastAPI 时整理的笔记。上次学的都是「数据怎么进来」(查询参数、请求体、校验),这次换了个方向,研究「数据怎么出去」——也就是 response_model,顺带把困扰我很久的「请求体 vs 查询参数」彻底分清楚了。 一句话总结这次的核心: response_model 是给接口出口装的筛子:你规定它只准返回哪些字段,多余的(比如密码)自动被丢掉。 下面按「响应模型 → 请求体 vs 查询参数 → 路由和参数到底是什么 → 最该记住的几点」来展开。 一、响应模型 response_model 1. 先讲痛点:返回数据会泄露敏感字段 在 FastAPI 里有条铁律:你 return 什么,前端就收到什么。 假设数据库里的用户带密码字段: class User(BaseModel): username: str password: str # 敏感字段! email: str @app.post("/users/") async def create_user(user: User): return user # 灾难:把 password 原样返回给了前端 这样写,密码就跟着 JSON 一起发出去了。response_model 就是用来堵这个漏洞的。 类比一下:Pydantic 请求体像安检进站(检查你带进来的东西);response_model 像安检出站(检查你带出去的东西,违禁品没收)。 2. 怎么用:进、出各写一个模型 经典套路是定义两个模型——一个收(带敏感字段),一个发(不带)。 from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() # 进:注册时前端要传的(含密码) class UserIn(BaseModel): username: str password: str email: str # 出:返回给前端的(不含密码!) class UserOut(BaseModel): username: str email: str @app.post("/users/", response_model=UserOut) # 关键在这 async def create_user(user: UserIn): return user # 即使返回了带 password 的对象,也会被过滤成 UserOut 神奇之处:函数里 return 的明明是带密码的 user,但前端收到的 JSON 里根本没有 password。FastAPI 在出门那一刻,按 UserOut 重新「拓印」了一份。 ...

3 min · 471 words · Jiaju