FastAPI 进阶:搭一个能跑 Agent 的后端

这是我学 FastAPI 进阶部分整理的笔记。和入门那篇(查询参数、请求体、response_model)不同,这次的目标很明确:搭一个能真正跑 agent 的后端——能调 LLM、能存对话记忆、能扛并发、能鉴权。 我现在是 vibe coding 的方式在学:不追求闭卷默写,而是「读得懂 AI 写的代码 + 能指出哪里不对 + 能说清自己要什么」。所以下面每个知识点我都标了两件事——它对写 agent 有什么用,以及大厂面试会怎么考。 先一句话串起全篇: 一个 agent 后端的骨架 = 接口(处理请求)+ 错误处理(诚实报错)+ 异步(扛并发)+ 数据库(存记忆)+ 依赖注入(管连接和鉴权)。 一、HTTPException:出错了要「诚实地报错」 痛点:硬返回 None 是在「撒谎」 查一只不存在的宠物,如果这么写: @app.get("/pets/{pet_id}") def get_pet(pet_id: int): pet = pets_db.get(pet_id) # 没找到,pet = None return pet # 直接返回 None 后果是:状态码还是 200 OK,body 是 null。这等于明明失败了却告诉前端「成功了」。前端通常这么判断: if (response.ok) { // 200 → ok 是 true,以为成功了 showPet(data.name); // data 是 null → 💥 报错 "Cannot read 'name' of null" } 更糟的是用中括号取值 pets_db[999]——直接 KeyError,FastAPI 兜底返回 500,把「用户查了个不存在的 id」(用户的锅,4xx)甩锅成「服务器坏了」(服务器的锅,5xx)。 ...

5 min · 952 words · Jiaju

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