「新手能听懂」+「一步一步」+「最后能跑起来」
FastAPI / Flask 核心 → 高并发原理 → 鉴权 → 大模型对话 API 实战
不讲晦涩源码,只讲"为什么 + 怎么用 + 能干嘛"
前情回顾大模型应用开发的基础工具与原理之Python 入门基础
一、FastAPI vs Flask(先选哪个?)
| 对比 | Flask | FastAPI |
|---|---|---|
| 学习难度 | ⭐⭐ | ⭐⭐⭐ |
| 性能 | 一般 | 很高(异步) |
| 接口文档 | 手写 | 自动生成 |
| 现代项目 | 较少 | 主流 |
📌 建议:
👉 新项目 / AI 接口 👉 直接 FastAPI
👉 快速 demo 👉 Flask
下面重点讲 FastAPI,Flask 会类比说明。
二、FastAPI 核心 3 件套--新手必会内容
路由 + 依赖注入 + 接口文档
1️⃣ 接口入口--路由
最小 FastAPI 项目
python
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"msg": "hello fastapi"}
运行:
bash
uvicorn main:app --reload
访问:
常见 HTTP 方法
python
@app.get("/items")
@app.post("/items")
@app.put("/items/{item_id}")
@app.delete("/items/{item_id}")
📌 记忆口诀
GET 查|POST 增|PUT 改|DELETE 删
2️⃣ 非常重要的参数获取
路径参数
python
@app.get("/user/{user_id}")
def get_user(user_id: int):
return {"user_id": user_id}
查询参数
python
@app.get("/search")
def search(q: str, page: int = 1):
return {"q": q, "page": page}
用 Pydantic 请求体
python
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
@app.post("/user")
def create_user(user: User):
return user
📌 好处
- 自动校验
- 自动文档
- 自动提示
3️⃣ FastAPI 最大优势--接口文档
📘 自动生成:
/docs(Swagger)/redoc
📌 新手福利
不用写文档,写代码 = 文档
三、FastAPI 灵魂依赖注入
1️⃣ 什么是依赖注入(人话版)
公共逻辑,不要写重复
比如:
- 登录校验
- 数据库连接
- 参数校验
2️⃣ 最简单的依赖
python
from fastapi import Depends
def common_params():
return {"version": "v1"}
@app.get("/info")
def info(params=Depends(common_params)):
return params
📌 记忆
Depends= 自动帮你执行函数并注入结果
3️⃣ 登录校验依赖(重点)
python
def check_token(token: str):
if token != "abc123":
raise Exception("未授权")
return token
@app.get("/secure")
def secure(token: str, t=Depends(check_token)):
return {"msg": "已登录"}
四、通俗易懂新手版FastAPI 高并发原理
1️⃣ 为什么 FastAPI 快?
三个核心原因:
✅ 1)异步 async / await
python
@app.get("/async")
async def async_api():
await asyncio.sleep(1)
return {"msg": "ok"}
✅ 2)事件循环(单线程多任务)
等 IO 的时候,切换任务,不浪费时间
✅ 3)ASGI + Uvicorn
- Flask:WSGI(同步)
- FastAPI:ASGI(异步)
📌 一句话总结
FastAPI 快,是因为它「不傻等」
2️⃣ 什么时候才有高并发优势?
✔ IO 密集(接口、数据库、模型请求)
❌ 纯计算(CPU 密集)
五、新手必会的接口鉴权实现
1️⃣ 最常见Token 鉴权
请求头
http
Authorization: Bearer abc123
依赖实现
python
from fastapi import Header, HTTPException
def verify_token(authorization: str = Header(None)):
if authorization != "Bearer abc123":
raise HTTPException(status_code=401, detail="未登录")
使用
python
@app.get("/chat")
def chat(dep=Depends(verify_token)):
return {"msg": "安全接口"}
📌 记忆
鉴权 = Header + Depends
2️⃣ JWT(知道即可)
Token + 过期时间 + 签名
真实项目用得多,但新手先理解 Token 即可
六、实战:大模型对话 API(重点)
我们模拟一个 LLM 对话接口结构(可接 OpenAI / 本地模型)
1️⃣ 请求格式设计
json
POST /chat
{
"messages": [
{"role": "user", "content": "你好"}
]
}
2️⃣ 定义请求模型
python
class Message(BaseModel):
role: str
content: str
class ChatRequest(BaseModel):
messages: list[Message]
3️⃣ 模拟大模型回复函数
python
async def call_llm(messages):
await asyncio.sleep(1) # 模拟模型耗时
return "你好,我是大模型 🤖"
4️⃣ 完整对话 API(核心)
python
from fastapi import FastAPI, Depends, Header, HTTPException
from pydantic import BaseModel
import asyncio
app = FastAPI()
def verify_token(authorization: str = Header(None)):
if authorization != "Bearer abc123":
raise HTTPException(status_code=401, detail="Unauthorized")
class Message(BaseModel):
role: str
content: str
class ChatRequest(BaseModel):
messages: list[Message]
async def call_llm(messages):
await asyncio.sleep(1)
return "你好,我是大模型 🤖"
@app.post("/chat")
async def chat(
req: ChatRequest,
auth=Depends(verify_token)
):
reply = await call_llm(req.messages)
return {
"reply": reply,
"usage": {"tokens": 100}
}
5️⃣ 测试方式
bash
curl -X POST http://127.0.0.1:8000/chat \
-H "Authorization: Bearer abc123" \
-H "Content-Type: application/json" \
-d '{"messages":[{"role":"user","content":"你好"}]}'
七、终极记忆口诀(送你)
🔑 FastAPI 学习口诀
路由定入口
模型管数据
Depends 做复用
async 提并发
Header 来鉴权
/docs 看文档
八、推荐资源
FastAPI 官方文档、《FastAPI 实战》