FastAPI 入门第一周学习笔记:从基础到调用 DeepSeek API 的完整总结
一、FastAPI 基础概念
-
异步特性(
async/await)对我的意义:await是“非阻塞的等待”,而普通函数调用是“阻塞的等待”。async用于定义一个协程函数,调用时不会立即执行,而是返回一个协程对象。两者配合实现非阻塞等待。 -
如何启动服务(
uvicorn main:app --reload):学习了FastAPI服务器的基本配置与调用,使用
-
自动生成的交互文档路径:
自动生成的交互文档路径:
/docs和/redoc,默认在http://127.0.0.1:8000/docs可访问,用于在线测试和查看接口定义。这让测试变得方便快捷
二、路由与参数
- 路径参数(
/user/{id})- 作用:让同一个接口能根据不同的输入,返回不同的输出,实现动态交互
- 类型注解与
Path校验:description注解,gt/ge,lt/le,max_length/min_length
- 查询参数(
?skip=0&limit=10)- 作用:用来怎么选,比如排序,分类
Query函数用法:用法与Path相似
- 请求体(
POST请求携带的数据)- 与路径/查询参数的区别:其是为服务器提供数据的
三、数据校验(Pydantic)
-
BaseModel的作用:他能帮助我们自动校验、类型转换和序列化 -
具体写法如下:
class ChatRequest(BaseModel): message: str = Field(..., description="用户输入的消息", min_length=1) -
Field常用参数:...(必填) / 默认值min_length/max_lengthgt/lt(数值)
-
请求体自动校验失败时返回的状态码:自动返回 422 Unprocessable Entity 状态码
四、响应处理
-
直接返回 dict / Pydantic 模型
FastAPI 会自动将返回的字典或 Pydantic 模型对象转换为 JSON 格式,并设置正确的
Content-Type: application/json -
response_model的作用:限制和格式化服务器返回给客户端的数据例如:
*@app.post("/chat", response_model=ChatResponse)* -
response_class与response_model的区别:model改变了响应的数据结构,而class改变响应的媒体格式,且二者可以同时使用
-
返回文件(
FileResponse)场景:后续拓展
五、与外部 API 交互(以 DeepSeek 为例)
-
为什么要用环境变量存储 API Key:
安全且高效
-
OpenAI 客户端初始化(
base_url作用):告诉客户端将请求发送到哪个服务器地址
-
构造
messages列表的格式:messages = [{"role": "user", "content": request.message}]这是 OpenAI API 标准的对话消息格式,
role可以是user、assistant、system。DeepSeek 完全兼容此格式。 -
调用
client.chat.completions.create的核心参数:model:temperature:max_tokens:- 本周并未进行模型具体调优学习,下周进行深入学习
-
异常处理(
try...except+HTTPException):捕获异常,并通过
raise HTTPException(status_code=500, detail=str(e))返回异常
六、前后端交互与 CORS
-
前端
fetch基本用法(本周仅实践,未深入原理)- 方法(
method):POST - 请求头(
headers):'Content-Type': 'application/json' - 请求体(
body与JSON.stringify):将{ message }转为 JSON 字符串 - 处理响应(
res.ok、res.json()):检查状态码,解析 JSON
详细机制将在后续前端课程中学习。
- 方法(
-
错误处理(网络错误、HTTP 错误状态)
已实现简单的错误提示,但未系统学习。后续会补充。
-
CORS 跨域问题
为了解决浏览器“file://”协议或不同端口导致的跨域限制,在后端添加了
CORSMiddleware,允许所有源。具体原理和配置细节待深入学习。
七、常见问题与解决(踩坑记录)
| 问题现象 | 原因 | 解决方法 |
|---|---|---|
| 端口被占用 | 上一个 uvicorn 进程未完全退出,或后台有残留进程 |
先netstat -ano | findstr :8000找到 PID, 再通过taskkill /PID <PID> /F强制结束;或重启电脑 |
| 环境变量未生效 | 每次打开新终端需重新设置;或在 IDE 中运行时未继承系统环境变量 | 在终端中执行 $env:DEEPSEEK_API_KEY="sk-xxx"(PowerShell);或将 Key 写在 .env 文件中用 python-dotenv 加载 |
| 控制台中文乱码 | PowerShell 默认输出编码为 GBK,而 API 返回 UTF-8 | 返回 UTF-8执行 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8;或用 Invoke-RestMethod 时直接赋值给变量再查看 |
curl 命令报错 |
PowerShell 中 curl 是 Invoke-WebRequest 别名,参数不同;且 JSON 转义困难 |
使用 curl.exe 代替 curl;或使用 Invoke-RestMethod 原生命令;或将 JSON 写在一行并用双引号转义 |
| 前端跨域报错 | 浏览器同源策略,前端与后端端口/协议不同 | 在后端添加 CORSMiddleware,设置 allow_origins=["*"](开发环境) |
更多推荐

所有评论(0)