FastAPI / 已完成

FastAPI 入门到进阶

先建立 FastAPI、接口、请求方法、参数、响应和自动文档的基础概念。

返回学习路线

一句话:FastAPI 就是一个用 Python 写“后端接口”的工具,让别人可以通过网址来问你的程序要数据、交数据、改数据。

目录

  1. FastAPI 是什么
  2. 它解决什么问题
  3. 最小例子
  4. 核心概念
  5. 做一个简单接口
  6. 进阶但常用的东西
  7. 常见错误
  8. 学习顺序

1. FastAPI 是什么

你可以把 FastAPI 想成一个“餐厅前台”。

用户、网页、小程序、App 来点餐:

我要看商品列表
我要登录
我要提交订单
我要查这个用户的信息

FastAPI 就像前台一样负责接待:

你要什么?
参数给我。
我检查一下。
我去后厨处理。
处理完把结果还给你。

这里的“前台”就是接口服务。

2. 它解决什么问题

假设你有一个前端页面,它不能直接去数据库里乱翻东西。它需要问后端:

GET /users/1

意思是:我要查 id 为 1 的用户。

后端收到后,去数据库查,然后返回:

{
  "id": 1,
  "name": "小明"
}

FastAPI 就是帮你快速写这种后端接口的框架。

它的优点很实在:

优点大白话
写得少几行代码就能开接口
自动检查数据用户传错类型,它会提醒
自动生成接口文档写完接口,/docs 页面自动出来
Python 类型提示友好编辑器能帮你补全、报错
性能不错底层用了 Starlette 和 Pydantic

3. 第一个最小例子

先安装:

pip install "fastapi[standard]"

新建 main.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def hello():
    return {"message": "Hello FastAPI"}

运行:

fastapi dev main.py

打开:

http://127.0.0.1:8000

你会看到:

{
  "message": "Hello FastAPI"
}

再打开:

http://127.0.0.1:8000/docs

这就是 FastAPI 自动生成的接口测试页面。你不用自己写 Swagger 文档,它会自动帮你生成。

4. 核心概念

app

app = FastAPI()

这就像开了一家餐厅。后面所有接口都挂在这个 app 上。

路径 path

@app.get("/users")

/users 就是路径。别人访问这个地址,就会来到这个接口。

请求方法 method

常见有 4 个:

方法大白话
GET查东西
POST新增东西
PUT整体修改
DELETE删除东西

比如:

@app.get("/users")
def get_users():
    return ["小明", "小红"]

@app.post("/users")
def create_user():
    return {"message": "创建成功"}

函数

def get_users():
    return ["小明", "小红"]

当有人访问 /users,FastAPI 就会调用这个函数。

返回值

你可以直接返回字典、列表、字符串、数字。FastAPI 会帮你变成 JSON。

return {"name": "小明", "age": 10}

5. 做一个简单用户接口

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    name: str
    age: int

users = []

@app.get("/users")
def list_users():
    return users

@app.post("/users")
def create_user(user: User):
    users.append(user)
    return {
        "message": "创建成功",
        "user": user
    }

@app.get("/users/{user_id}")
def get_user(user_id: int):
    if user_id < 0 or user_id >= len(users):
        return {"error": "用户不存在"}
    return users[user_id]

这里为了让你先看懂流程,暂时用了内存里的 users = [],也暂时用了 return {"error": ...}。正式项目里,数据应该放数据库,错误应该用后面会讲的 HTTPException

这里重点看这个:

class User(BaseModel):
    name: str
    age: int

这叫数据模型。大白话就是:你告诉 FastAPI,“新增用户必须长这样”。

如果前端传:

{
  "name": "小明",
  "age": 10
}

可以。

如果传:

{
  "name": "小明",
  "age": "十岁"
}

FastAPI 会发现 age 应该是数字,不应该是文字,然后自动报错。

这就是 FastAPI 很爽的地方:它帮你守门。

6. 参数怎么传

路径参数

@app.get("/users/{user_id}")
def get_user(user_id: int):
    return {"user_id": user_id}

访问:

/users/3

user_id 就是 3

查询参数

@app.get("/search")
def search(keyword: str, page: int = 1):
    return {
        "keyword": keyword,
        "page": page
    }

访问:

/search?keyword=apple&page=2

就能拿到:

{
  "keyword": "apple",
  "page": 2
}

请求体 body

一般 POST 用 body:

class Product(BaseModel):
    name: str
    price: float

@app.post("/products")
def create_product(product: Product):
    return product

前端传 JSON:

{
  "name": "苹果",
  "price": 9.9
}

7. async 是什么

你会看到有些例子这样写:

@app.get("/")
async def hello():
    return {"message": "hi"}

async 可以理解成:这个函数可能会等别人,比如等数据库、等网络请求。等的时候,它不会傻站着,可以先去处理别的请求。

大白话:

普通 def:我在窗口等你办完,别人先排队。
async def:你去拿材料时,我先服务下一个人。

刚入门时记住:

场景写法
普通逻辑、简单计算def 可以
数据库、网络、文件等异步操作常用 async def

不用一开始就纠结。先会写接口更重要。

8. 常用进阶功能

HTTPException:认真地报错

不要这样:

return {"error": "用户不存在"}

更推荐:

from fastapi import HTTPException

@app.get("/users/{user_id}")
def get_user(user_id: int):
    if user_id < 0 or user_id >= len(users):
        raise HTTPException(status_code=404, detail="用户不存在")
    return users[user_id]

这样前端能明确知道:这是 404 错误。

Depends:公共逻辑复用

比如很多接口都要检查 token:

from fastapi import Depends

def check_token(token: str):
    if token != "123":
        raise HTTPException(status_code=401, detail="未登录")
    return token

@app.get("/profile")
def profile(token: str = Depends(check_token)):
    return {"message": "这是个人资料"}

这个例子为了讲清楚 Depends,先用普通参数模拟 token。正式项目通常会从请求头里的 Authorization: Bearer <token> 读取 token。

Depends 大白话就是:进这个接口之前,先做一件公共检查。

APIRouter:接口太多时分文件

项目小的时候,全部写 main.py 可以。

项目大了以后,应该拆:

app/
  main.py
  routers/
    users.py
    products.py

users.py 专门放用户接口,products.py 专门放商品接口。

9. 常见错误

错误原因怎么改
打不开 127.0.0.1:8000服务没启动先运行 fastapi dev main.py
/docs 没接口装饰器没写对检查 @app.get(...)
参数一直报错类型不匹配看你写的是 intstr 还是模型
POST 收不到数据没用 Pydantic 模型BaseModel 定义 body
修改代码没生效服务没重载开发时用 fastapi dev
路径写错前端请求地址不一致对照 /docs 页面测试

10. 你应该怎么学

按这个顺序就行:

  1. 先会启动服务:main.py + fastapi dev main.py
  2. 学会写 GET
  3. 学会写 POST
  4. 学会路径参数:/users/{id}
  5. 学会查询参数:?page=1
  6. 学会 Pydantic 模型
  7. 学会用 /docs 测接口
  8. 学会 HTTPException
  9. 学会拆分 APIRouter
  10. 再学数据库、登录、部署

11. 小抄

代码意思
app = FastAPI()创建 FastAPI 应用
@app.get("/")定义一个 GET 接口
@app.post("/users")定义一个 POST 接口
BaseModel定义请求数据长什么样
HTTPException返回标准错误
/docs自动接口文档
/redoc另一种接口文档
/openapi.json机器可读的接口说明
fastapi dev main.py开发环境启动

最后一句话总结

FastAPI 的核心就是:用 Python 函数接住 HTTP 请求,把参数检查好,处理业务,再把 JSON 返回给前端。先别急着学数据库、权限、部署,先把“路径、方法、参数、返回值、模型、文档”这 6 件事吃透,FastAPI 就算入门了。

参考资料