【FastAPI:Python Web开发的新宠儿】

2 阅读7分钟

FastAPI:Python Web开发的新宠,5分钟带你入门高性能API构建

摘要:还在用Flask写接口?FastAPI来了!基于Python类型提示,自动生成文档,性能比肩Node.js和Go。本文将带你从0到1快速上手FastAPI,掌握现代Python Web开发的核心利器,让你的API开发效率起飞!


前言

哈喽大家好,我是爱摸鱼的打工仔

最近在公司重构旧项目,老板要求接口响应速度提升50%,还要自动生成接口文档给前端看。我反手就掏出了FastAPI,一顿操作猛如虎,结果不仅性能达标,连文档都省了手写的时间。

今天,我就把这套“摸鱼”神器分享给你们,带你快速入门这个Python Web开发的新宠!


为什么选择FastAPI?

在FastAPI出现之前,我们写Python Web接口通常用Flask或Django。虽然它们很成熟,但在现代开发中有些痛点:

  • 性能瓶颈:传统的WSGI框架在处理高并发时,性能相对有限。
  • 文档繁琐:写完接口还得手写Swagger文档,改代码还得同步改文档,心累。
  • 类型检查弱:Python是动态语言,运行时才发现类型错误,调试头大。

FastAPI 就是为了解决这些问题而生的:

  • 极速性能:基于Starlette和Pydantic,性能直接对标Node.js和Go,处理高并发游刃有余。
  • 自动文档:写完代码,Swagger UI和ReDoc文档自动生成,还能在线调试,前端看了都流泪。
  • 类型安全:利用Python 3.6+的类型提示,数据验证自动完成,Bug少一半。

快速上手:5分钟写出第一个API

废话不多说,直接开干!

第一步:安装

你需要安装FastAPI和一个ASGI服务器(推荐Uvicorn):

pip install fastapi uvicorn

第二步:写代码

创建一个 main.py 文件:

from fastapi import FastAPI
from pydantic import BaseModel

# 初始化应用
app = FastAPI(title="我的第一个FastAPI应用")

# 定义数据模型(请求体)
class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

# 定义路由
@app.get("/")
async def read_root():
    return {"Hello": "World"}

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

@app.post("/items/")
async def create_item(item: Item):
    # FastAPI会自动验证item的数据类型
    response_item = item.dict()
    if item.price > 100:
        response_item["message"] = "这是个昂贵的物品"
    return response_item

代码详解

引入外援:导入必要的工具包

from fastapi import FastAPI
from pydantic import BaseModel
  • from fastapi import FastAPI: 这就像是你去开工厂,首先得把“工厂机器”买回来。FastAPI 就是这个类,用来创建一个 Web 应用实例。
  • from pydantic import BaseModel: Pydantic 是 FastAPI 的好搭档。你可以把它想象成一个“严格的质检员”。它的作用是定义数据的格式,确保别人传给你的数据是符合要求的(比如规定价格必须是数字,不能是文字)。

开工厂:初始化应用

app = FastAPI(title="我的第一个FastAPI应用")
  • app = FastAPI(...): 这行代码就是把你刚才买回来的“工厂机器”启动起来。app 这个变量就是你整个网站的代表。以后定义路由、处理请求,都要用到它。
  • title="...": 这是给 API 文档起个名字。稍后你运行起来去浏览器看文档时,左上角就会显示这个标题。

定规矩:定义数据模型

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

这部分是告诉“质检员”(Pydantic),如果用户要创建一个商品,必须包含哪些信息:

  • class Item(BaseModel): 我们定义了一个叫 Item 的类,它继承了 BaseModel,说明它是一个数据模型。
  • name: str: 必须有一个叫 name 的字段,而且必须是字符串(文字)。
  • price: float: 必须有一个叫 price 的字段,而且必须是浮点数(小数)。
  • is_offer: bool = None: 必须有一个叫 is_offer 的字段,应该是布尔值(True/False)。= None 表示这个字段是可选的,如果不传也没关系,默认为空。

它的作用:稍后在 create_item 函数里,FastAPI 会自动检查用户发来的 JSON 数据。如果用户把 price 传成了 "abc",质检员会直接拦截并报错,不需要你手写代码去验证。

修路:定义路由

FastAPI 的核心就是“路由”,也就是定义 URL 地址和 Python 函数之间的对应关系。

1. 欢迎页面

@app.get("/")
async def read_root():
    return {"Hello": "World"}
  • @app.get("/"): 这是一个装饰器。它的意思是:当浏览器用 GET 方法访问根目录 / 时,请执行下面的函数。
  • async def read_root(): 定义了一个异步函数。async 是 FastAPI 的精髓,意味着它处理请求时效率很高,不会因为一个请求卡住而堵住其他请求。
  • return {"Hello": "World"}: 函数返回了一个字典。FastAPI 会自动把这个字典转换成 JSON 格式返回给浏览器。

2. 获取单个商品(路径参数)

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}
  • @app.get("/items/{item_id}"): 注意这里的花括号 {item_id}。这代表一个“路径参数”。意思是任何访问 /items/1/items/999 的请求都会匹配到这里。
  • item_id: int: 这是一个很酷的特性。FastAPI 看到 URL 里有 {item_id},又看到函数参数里定义了 item_id: int,它会自动把 URL 里的字符串转换成整数传给你。如果用户传了 /items/abc,FastAPI 会自动报错,因为它不是整数。
  • q: str = None: 这是一个“查询参数”。对应 URL 里的 ?q=xxx。比如 /items/5?q=red,那么 q 的值就是 "red"。= None 表示这个参数是可选的。

3. 创建商品(请求体)

@app.post("/items/")
async def create_item(item: Item):
    # FastAPI会自动验证item的数据类型
    response_item = item.dict()
    if item.price > 100:
        response_item["message"] = "这是个昂贵的物品"
    return response_item
  • @app.post("/items/"): 这次用的是 POST 方法,通常用于向服务器发送数据。
  • item: Item: 这里用到了刚才定义的 Item 类。FastAPI 看到这里的类型提示是 Item,就会知道:哦,这个请求的正文(Body)里应该包含一个 JSON 对象,并且要按照 Item 的规矩来。
  • item.dict(): 把 Pydantic 模型转换成普通的 Python 字典,方便操作。
  • if item.price > 100: 这里演示了业务逻辑。因为 item.price 已经被强制转换成了 float 类型,所以你可以放心地拿它做数学比较。

总结

这段代码虽然只有几十行,但它展示了 FastAPI 最强大的三个“自动化”能力:

  • 自动路由:通过装饰器把 URL 映射到函数。
  • 自动验证:通过 Pydantic 和类型提示,自动检查数据格式(是不是整数、是不是必填)。
  • 自动文档:你写完这些代码运行后,FastAPI 会自动生成一个 Swagger UI 界面,你可以在网页上直接测试这些接口,完全不需要写额外的文档代码。

第三步:运行

在终端执行:

uvicorn main:app --reload
  • main: 文件名
  • app: FastAPI实例变量名
  • --reload: 开发模式下,代码修改后自动重启

第四步:查看文档

打开浏览器访问 http://127.0.0.1:8000/docs,你会看到一个功能完整的Swagger UI界面,可以直接测试接口!


核心功能解析

1. 强大的类型验证(Pydantic)

FastAPI利用Pydantic模型定义数据结构,自动完成:

  • 数据验证(类型检查、必填项等)
  • 数据转换(如字符串转整数)
  • 自动序列化/反序列化
class User(BaseModel):
    username: str
    password: str
    age: int = 0  # 默认值

# FastAPI会自动验证请求体是否符合这个模型

2. 依赖注入系统

FastAPI拥有Python框架中最强大的依赖注入系统之一,可以轻松处理数据库会话、用户认证等:

from fastapi import Depends

async def common_parameters(q: str = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}

@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return commons

3. 异步支持

FastAPI原生支持 async/await,非常适合I/O密集型应用(如数据库查询、外部API调用):

@app.get("/users/")
async def get_users():
    # 模拟异步数据库查询
    users = await fetch_users_from_db()
    return users

生产环境部署

开发完成后,如何部署到生产环境?

1. 使用Gunicorn管理进程

gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
  • -w 4: 4个工作进程
  • -k uvicorn.workers.UvicornWorker: 使用Uvicorn worker

2. Docker容器化部署

创建 Dockerfile

FROM python3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

总结

FastAPI凭借其高性能、自动文档和类型安全,正在成为Python Web开发的首选框架。无论你是构建微服务、机器学习模型服务,还是高并发Web应用,FastAPI都能让你事半功倍。

赶紧去试试吧,说不定下一个摸鱼高手就是你!

我是爱摸鱼的打工仔,关注我,带你轻松搞定技术栈!