FastAPI 入门指南:用 Python 极速构建 API

FastAPI 入门指南:用 Python 极速构建 API

写 Web 接口,Flask 轻量但得自己拼很多;Django 全家桶又偏重。FastAPI 出自 2018 年,凭借异步支持、自动文档、类型校验三大杀器,迅速成为 Python API 开发的首选。本文从零带你跑通第一个 FastAPI 服务。

一、环境准备

bash 复制代码
pip install "fastapi[standard]"

[standard] 会一并装上 uvicorn(ASGI 服务器)、pydantic 等依赖。要求 Python 3.8+,推荐 3.10+。

二、最小可运行示例

创建 main.py:

python 复制代码
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"msg": "Hello FastAPI"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

启动:

bash 复制代码
uvicorn main:app --reload

访问 http://127.0.0.1:8000/ 返回 JSON;访问 http://127.0.0.1:8000/docs 即可看到自动生成的交互式 Swagger 文档------这是 FastAPI 最让人惊艳的特性之一。

三、核心概念

  • 路径操作装饰器 :@app.get / @app.post 等映射 HTTP 方法。
  • 类型注解即校验 :函数参数写 item_id: int,FastAPI 自动做类型转换与校验,非法请求返回 422。
  • Pydantic 模型 :用 BaseModel 定义请求体,自动校验 + 生成文档。

四、进阶用法:请求体与校验

定义注册接口,演示 Pydantic 模型:

python 复制代码
from pydantic import BaseModel, EmailStr

class User(BaseModel):
    name: str
    email: EmailStr
    age: int = 18   # 默认值

@app.post("/users")
def create_user(u: User):
    return {"created": u.name, "email": u.email}

EmailStr 需 pip install email-validator。传入非法邮箱会被自动拦截并返回清晰错误。

五、实战场景:带查询过滤的列表接口

模拟一个分页查询用户列表:

python 复制代码
users = [{"id": i, "name": f"user{i}"} for i in range(1, 101)]

@app.get("/users")
def list_users(skip: int = 0, limit: int = 10):
    return users[skip : skip + limit]

访问 /users?skip=10&limit=5 即可翻页。真实项目中把 users 换成数据库查询即可。

六、常见坑 / 报错

1. ModuleNotFoundError: No module named 'uvicorn' 只装了 fastapi 没装服务器。解决:pip install "fastapi[standard]" 或直接 pip install uvicorn。

2. 改了代码不生效 忘了加 --reload,或用了错误的启动命令。正确:uvicorn main:app --reload,其中 main 是文件名(不含 .py),app 是实例名。

3. 422 Unprocessable Entity 请求体字段类型/必填不符。检查 Pydantic 模型字段是否必填、类型是否匹配(如字符串传成数字)。

七、总结与下一步

FastAPI 用类型注解把"写接口 + 校验 + 文档"三件事一次搞定,开发体验远超传统框架。下一步建议:

  • 用 fastapi.SQLAlchemy 或 databases 接数据库;
  • 用 OAuth2PasswordBearer 做登录鉴权;
  • 用 BackgroundTasks 处理异步任务(发邮件等)。

从今天起,把你的 Python 函数变成 API 只需几分钟。

相关推荐
橙橙笔记1 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
小小张说故事2 小时前
Python 的 class 语句到底执行了什么?拆开 __prepare__、metaclass.__new__ 和那个被讲反的 __set_name__ 顺序
python
在所不辞兄2 小时前
为什么神经网络在训练集损失已接近零后继续训练,测试性能仍可能继续提升,而不是单纯地越来越过拟合?
人工智能·深度学习·神经网络·机器学习·智能仿真
天天被压力4 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力4 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A4 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
小lo想吃棒棒糖4 小时前
把机器人训练从 GPU 搬到昇腾 NPU:启元 Q1 起身动作 PPO 训练全记录
python·机器人·昇腾·启元机器人
Rocky Ding*5 小时前
深入浅出IDM-VTON论文精读:虚拟试衣怎样同时保住服装语义与局部细节
论文阅读·人工智能·深度学习·机器学习·aigc·ai-native·idm-vton
Thanks_ks5 小时前
【第 006 讲】搭建 PyCharm 开发环境:PyCharm 的下载与安装 | 初始设置与常用配置
ide·python·pycharm·开发工具·jetbrains·开发环境·集成开发环境
weixin_468466855 小时前
视觉Transformer的“第二次革命”:ViT³如何用测试时训练重构注意力范式
人工智能·深度学习·机器学习·ai·重构·transformer·vit