构建一个 Web API,最重要的无非就是速度和效率。FastAPI,这个名字直白得让人没法误会,就是来搞速度的。它是基于 Python 的现代 Web 框架,以简洁、高效和极致性能著称。今天咱们就来聊聊这个工具,到底怎么用,为什么快,哪里让你爱不释手。
FastAPI 是个啥?
FastAPI 的核心特点是它使用了 Python 的类型提示(Type Hints)和异步支持。它让你写的代码既有高可读性,又能轻松获得性能优势,最妙的是,你再也不用为了文档而“摸鱼”了——API 文档是自动生成的,还是实时的。
它靠的不是魔法,是基于 Starlette 和 Pydantic 的组合拳,这两位老兄一个管 Web 框架,一个管数据验证,加起来就是强无敌的 API 工具。
温馨提示:FastAPI 的运行性能接近 Node.js 和 Go,如果你是性能控,这句话基本够了。
快速上手:Hello, FastAPI!
来看最简单的 FastAPI 应用,五行代码搞定一个 API:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}
保存为 app.py
,然后运行:
uvicorn app:app --reload
访问 http://127.0.0.1:8000,页面会显示:{"message": "Hello, FastAPI!"}
。
这段代码里几个重点:
FastAPI()
是整个应用的“老大哥”,所有路由都挂它上面。@app.get("/")
是个装饰器,定义了一个 HTTP GET 方法,路径是/
。- 函数
read_root
返回了一个 JSON 响应。
是不是简单到不像话?这就是 FastAPI 的日常。
路径参数与类型验证
FastAPI 的厉害之处是直接把 Python 的类型系统用到了 API 的参数上,代码写得优雅,用户也不迷糊。
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "query": q}
访问 http://127.0.0.1:8000/items/42?q=hello
,结果是:
{
"item_id": 42,
"query": "hello"
}
几点注意:
item_id
自动推断为整数类型,如果你传了个字符串过去,它会直接抛 422 错误,API 完整性直接拉满。q
是可选参数(默认值为None
),有就显示,没有也不会炸。
温馨提示:FastAPI 的错误提示非常清楚,省了很多 debug 的功夫。
自动生成文档,开发者的“偷懒神器”
只要你启动了服务,FastAPI 自动帮你生成两种文档接口:
- Swagger UI: http://127.0.0.1:8000/docs
- ReDoc: http://127.0.0.1:8000/redoc
无需额外配置,直接生成漂亮的交互式文档,接口调用、调试全搞定。别的框架呢?光配个 Swagger 都能让人头秃。
请求体和数据验证
除了路径参数,POST 请求的请求体也是 FastAPI 的强项,它用的是 Pydantic 数据模型,既能定义数据结构,还能自动验证。
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
def create_item(item: Item):
return {"item": item}
现在访问 http://127.0.0.1:8000/docs,你会发现 POST 请求的 JSON 结构已经生成了,试着发送以下数据:
{
"name": "Apple",
"description": "A juicy fruit",
"price": 1.2,
"tax": 0.1
}
返回结果:
{
"item": {
"name": "Apple",
"description": "A juicy fruit",
"price": 1.2,
"tax": 0.1
}
}
温馨提示:Pydantic 会自动验证数据类型,传错类型立马报错,帮你挡掉各种奇奇怪怪的请求。
异步支持,性能加速器
FastAPI 是天生的异步支持,用 async def
就能轻松写出非阻塞的接口。
import asyncio
@app.get("/delayed")
async def delayed_response():
await asyncio.sleep(2)
return {"message": "This is delayed"}
这个接口会延迟 2 秒返回。对于需要处理大量 IO 的应用,比如和数据库频繁交互的场景,异步的性能提升非常显著。
温馨提示:如果你写的逻辑是纯 CPU 密集型任务,比如处理大数据,异步可能帮不上忙,得换多线程或者其他方式。
部署也很简单
开发完 API,部署是绕不开的话题。FastAPI 推荐的部署方式是用 Uvicorn 搭配 Gunicorn。
以下是一种简单的部署方式:
gunicorn -k uvicorn.workers.UvicornWorker app:app -w 4 -b 0.0.0.0:8000
这里 -w 4
表示使用 4 个 worker,具体数量可以根据你的 CPU 核心数调整。
常见的坑
- 路径参数和查询参数搞混
/items/{id}
和?id=42
是两种不同的传参方式,一个是路径参数,一个是查询参数,记得区分。 - 异步代码里的同步操作
如果你在async def
里用了同步的数据库查询,性能还不如老老实实写同步代码。 - 缺少数据验证
别偷懒,Pydantic 模型不仅优雅,还能帮你挡掉绝大部分的奇葩请求。
这就是 FastAPI 的大致使用方式了!它简单、优雅,又不缺性能,是构建现代 Web API 的利器。用它写代码,就像在跑一辆性能超强的小跑车,开起来特别顺手。去试试吧!
彩蛋时间
走过路过不要错过,为大家准备了一份pycharm破解工具,感兴趣的朋友可以看看哈:最新pycharm破解
评论区