文章列表
4 分钟阅读

FastAPI 安装与使用指南


系列:Python Web 框架

第 1 / 11 篇

  1. FastAPI 安装与使用指南
  2. FastAPI 进阶使用指南
  3. Django 安装与使用指南
  4. Django 进阶使用指南
  5. Django 与 FastAPI 对比:如何选择合适的 Python Web 框架
  6. Python Web 框架有哪些,怎么选
  7. Flask 安装与使用指南
  8. Django REST Framework 入门:把 Django 做成 API
  9. FastAPI 项目实战:用户登录与 JWT 鉴权
  10. Python Web 项目部署指南:Gunicorn、Uvicorn、Nginx 和 Docker
  11. Python Web 项目结构怎么设计

FastAPI 是一个基于 Python 类型提示的现代 Web 框架,特点是高性能、自动生成 API 文档、内置数据校验。它的核心优势:

  • :基于 Starlette 和 Pydantic,性能与 Node.js、Go 接近
  • 自动文档:自动生成 Swagger UI 和 ReDoc 交互式文档
  • 类型安全:利用 Python 类型提示做参数校验和序列化
  • 简洁:用少量代码就能写出完整的 REST API

适用环境

FastAPI 需要 Python 3.8 及以上版本。本文在 Linux 环境下示范,macOS 和 Windows 同样适用。

安装前确认 Python 版本:

Terminal window
python3 --version

建议先创建虚拟环境,避免依赖冲突。以下使用 Python 内置的 venv 模块:

安装 FastAPI

创建项目目录并初始化虚拟环境:

Terminal window
mkdir fastapi-demo && cd fastapi-demo
python3 -m venv .venv
source .venv/bin/activate

激活后终端提示符前会出现 (.venv) 标识。接下来安装 FastAPI 和 ASGI 服务器:

Terminal window
pip install fastapi uvicorn[standard]
  • fastapi:框架本体
  • uvicorn[standard]:ASGI 服务器,[standard] 额外安装 uvloophttptools 以获得更好性能

安装完成后确认:

Terminal window
pip show fastapi

第一个应用

创建 main.py

from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}

启动服务:

Terminal window
uvicorn main:app --reload
  • main:app:模块 main 里的 app 实例
  • --reload:代码变更时自动重启,开发时使用

访问 http://127.0.0.1:8000 可以看到 JSON 响应。同时 FastAPI 自动生成了两份文档:

  • Swagger UI:http://127.0.0.1:8000/docs
  • ReDoc:http://127.0.0.1:8000/redoc

在 Swagger 页面可以直接测试接口,无需额外工具。

路径参数

路径参数用于从 URL 中提取动态值:

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

访问 /users/42 返回 {"user_id": 42}。FastAPI 会根据类型提示自动把字符串 "42" 转为整数 42。如果访问 /users/abc,FastAPI 会返回校验错误:

{
"detail": [
{
"type": "int_parsing",
"loc": ["path", "user_id"],
"msg": "Input should be a valid integer, unable to parse string as an integer"
}
]
}

查询参数

路径函数中不在路径里的参数会自动成为查询参数:

from typing import Optional
@app.get("/users")
def list_users(page: int = 1, size: int = 10, keyword: Optional[str] = None):
return {"page": page, "size": size, "keyword": keyword}

请求 /users?page=2&size=20&keyword=zhang 即可获得对应参数。FastAPI 还支持用 Query 做更细致的校验:

from fastapi import Query
@app.get("/search")
def search(q: str = Query(..., min_length=2, max_length=50, description="搜索关键词")):
return {"query": q}

Query(...) 表示 q 是必填参数,如果缺少会返回 422 错误。

请求体与数据模型

对于 POST、PUT 等请求,使用 Pydantic 模型定义请求体:

from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
description: str = ""
tax: float | None = None
@app.post("/items")
def create_item(item: Item):
total = item.price + (item.tax or 0)
return {"name": item.name, "total": total}

FastAPI 会自动:

  • 从请求体解析 JSON 并转为 Item 对象
  • 校验字段类型和必填项
  • 在文档中展示模型结构

测试时可以用 curl

Terminal window
curl -X POST http://127.0.0.1:8000/items \
-H "Content-Type: application/json" \
-d '{"name": "笔记本", "price": 15.5, "tax": 1.5}'

路由拆分

项目变大时,可以用 APIRouter 把路由拆到不同模块:

routers/users.py

from fastapi import APIRouter
router = APIRouter(prefix="/users", tags=["用户"])
@router.get("/")
def list_users():
return [{"id": 1, "name": "张三"}]
@router.post("/")
def create_user(name: str):
return {"id": 2, "name": name}

main.py 中引入:

from fastapi import FastAPI
from routers import users
app = FastAPI()
app.include_router(users.router)

prefix 设置路径前缀,tags 在文档中分组显示。

CORS 配置

如果前端和后端不在同一域名,需要配置跨域:

from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

开发阶段可以把 allow_origins 设为 ["*"],但生产环境应指定具体域名。

常用启动参数

Terminal window
uvicorn main:app --reload --host 0.0.0.0 --port 8080
参数说明
--reload文件变更自动重启
--host监听地址,默认 127.0.0.1
--port端口,默认 8000
--workers工作进程数(不要与 --reload 同时使用)
--log-level日志级别,可选 debug/info/warning/error

常见问题

pip 安装报找不到包

先确认虚拟环境已激活(终端提示符有 (.venv)),再升级 pip:

Terminal window
pip install --upgrade pip
pip install fastapi uvicorn[standard]

如果网络慢,可以换国内镜像源:

Terminal window
pip install fastapi uvicorn[standard] -i https://pypi.tuna.tsinghua.edu.cn/simple

端口已被占用

uvicorn 默认使用 8000 端口。如果端口被占用,指定其他端口:

Terminal window
uvicorn main:app --reload --port 8001

修改代码后不生效

检查是否带了 --reload 参数。另外 --reload 只监听 Python 文件的变更,修改静态文件不会触发重启。

生产环境部署

生产环境不要用 --reload,应该这样启动:

Terminal window
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4

也可以搭配 Gunicorn 管理进程:

Terminal window
pip install gunicorn
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000

总结

FastAPI 的核心优势是用 Python 类型提示同时实现数据校验、序列化和自动文档,省去了大量样板代码。这里介绍了安装、路由、参数校验、数据模型、路由拆分和 CORS 配置,足够搭建一个功能完整的后端服务。更多内容可以参考 FastAPI 官方文档

如果你还在比较框架选择,可以先看 Python Web 框架有哪些,怎么选;项目开始变复杂后,再继续阅读 FastAPI 进阶使用指南