模型应用开发的基础工具与原理之Web 框架

「新手能听懂」+「一步一步」+「最后能跑起来」
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 实战》

相关推荐
名字被你们想完了2 小时前
Flutter 实现一个容器内部元素可平移、缩放和旋转等功能(八)
前端·flutter
听风说图2 小时前
Figma画布协议揭秘:组件系统的设计哲学
前端
sure2822 小时前
在react native中实现短视频平台滑动视频播放组件
前端·react native
weibkreuz2 小时前
React开发者工具的下载及安装@4
前端·javascript·react
代码猎人2 小时前
link和@import有什么区别
前端
万少2 小时前
HarmonyOS6 接入快手 SDK 指南
前端·harmonyos
坐吃山猪2 小时前
Python之PDF小工具
开发语言·python·pdf
小肥宅仙女2 小时前
React + ECharts 多图表联动实战:从零实现 Tooltip 同步与锁定功能
前端·react.js·echarts