从零开始学 FastAPI:Python Web 开发新选择
在 Python Web 开发领域,Flask 和 Django 长期以来一直是两大主流框架。然而,随着异步编程和高性能需求的日益增长,一个名为 FastAPI 的新星正迅速崛起,成为许多开发者构建 API 和微服务的首选。本文将带你从零开始,了解 FastAPI 的魅力所在,并指导你迈出使用它的第一步。
为什么选择 FastAPI?
FastAPI 是一个现代、快速(高性能)、高生产力、基于标准(OpenAPI & JSON Schema)的 Python Web 框架。它的核心优势体现在以下几个方面:
- 极高的性能:FastAPI 基于 Starlette(用于 Web 部分)和 Pydantic(用于数据部分),并充分利用了 Python 的类型提示特性。这使得它能够提供与 Go 或 Node.js 等高性能语言相媲美的速度,尤其在处理异步请求时表现卓越。
- 快速的开发体验:由于其强大的类型提示支持,FastAPI 提供了自动的数据验证、序列化和反序列化,极大减少了样板代码。同时,内置的交互式 API 文档(Swagger UI 和 ReDoc)能让你在编写代码的同时自动生成详尽的 API 文档,实现“所写即所得”。
- 强大的数据验证:通过 Pydantic,你可以使用标准的 Python 类型提示来定义数据模型。FastAPI 会自动验证传入请求的数据,并在数据不符合预期时返回清晰的错误信息。这不仅提高了 API 的健壮性,也大大简化了数据处理逻辑。
- 异步支持:FastAPI 从设计之初就支持
async/await语法,使得它能够原生处理异步请求,非常适合构建高并发的 I/O 密集型应用。 - 易学易用:尽管功能强大,FastAPI 的 API 设计直观且易于理解。如果你有 Flask 或其他 Web 框架的基础,学习 FastAPI 将会非常顺畅。
- 成熟的生态系统:FastAPI 兼容并深度整合了许多流行的 Python 库,例如 SQLAlchemy、Requests、Celery 等,使得扩展功能变得轻而易举。
入门:你的第一个 FastAPI 应用
让我们通过一个简单的例子来感受 FastAPI 的开发流程。
1. 环境准备
首先,确保你安装了 Python 3.7+。然后,安装 FastAPI 和 ASGI 服务器(如 Uvicorn):
bash
pip install fastapi uvicorn
2. 编写你的第一个 API
创建一个名为 main.py 的文件,并添加以下代码:
“`python
main.py
from fastapi import FastAPI
创建一个 FastAPI 应用实例
app = FastAPI()
定义第一个路由:根路径
@app.get(“/”)
async def read_root():
return {“message”: “Hello, FastAPI!”}
定义一个带路径参数的路由
@app.get(“/items/{item_id}”)
async def read_item(item_id: int, query_param: str = None):
“””
获取指定 ID 的 Item。
item_id 是路径参数,必须是整数。
query_param 是可选的查询参数。
“””
return {“item_id”: item_id, “query_param”: query_param}
定义一个带请求体的 POST 路由
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
@app.post(“/items/”)
async def create_item(item: Item):
“””
创建一个新的 Item。
请求体必须符合 Item 模型。
“””
item_dict = item.dict()
if item.tax:
price_with_tax = item.price + item.tax
item_dict.update({“price_with_tax”: price_with_tax})
return item_dict
“`
代码解析:
from fastapi import FastAPI: 导入 FastAPI 类。app = FastAPI(): 创建 FastAPI 应用实例。@app.get("/"): 这是一个装饰器,用于定义一个处理 HTTP GET 请求的路由,路径为/。async def表明这是一个异步函数。read_root(): 当访问/路径时,这个函数会被调用,并返回一个 JSON 响应。@app.get("/items/{item_id}"): 定义一个带有路径参数item_id的 GET 路由。item_id: int声明了参数类型,FastAPI 会自动进行类型转换和验证。query_param: str = None: 定义一个可选的查询参数,默认值为None。class Item(BaseModel): 使用 Pydantic 的BaseModel定义了一个数据模型。这会自动为你的 API 请求体提供验证、序列化和生成文档的功能。str | None是 Python 3.10+ 的类型提示,等同于Optional[str]。@app.post("/items/"): 定义一个处理 HTTP POST 请求的路由。create_item(item: Item): FastAPI 会自动读取请求体,并将其解析为Item类的实例,同时进行数据验证。
3. 运行你的应用
在终端中,进入 main.py 所在的目录,然后运行 Uvicorn:
bash
uvicorn main:app --reload
main:app: 指示 Uvicorn 找到main.py文件中的app实例。--reload: 开启热重载模式,当你修改代码时,应用会自动重启。
你将看到类似以下的输出:
INFO: Will watch for changes in these directories: ['C:\\Users\\test\\Desktop\\proj']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [xxxxx] using WatchFiles
INFO: Started server process [xxxxx]
INFO: Waiting for application startup.
INFO: Application startup complete.
现在,你的 FastAPI 应用已经在 http://127.0.0.1:8000 上运行了!
4. 探索 API 文档
打开浏览器,访问 http://127.0.0.1:8000/docs。你将看到由 Swagger UI 自动生成的交互式 API 文档。你可以直接在这里测试你的 API 端点,发送请求并查看响应。
或者,访问 http://127.0.0.1:8000/redoc,查看另一种风格的 API 文档。
更多特性和进阶
FastAPI 的功能远不止于此,以下是一些值得你深入探索的特性:
- 依赖注入系统:FastAPI 拥有一个非常强大的依赖注入系统,可以让你轻松管理数据库连接、用户认证、外部服务等依赖。
- 安全认证:内置支持 OAuth2、JWT 等多种认证方式,以及 FastAPI 的安全工具。
- 数据库集成:可以无缝集成 SQLAlchemy、Tortoise ORM、Peewee 等 ORM,支持同步和异步数据库操作。
- WebSocket:支持构建实时通信应用。
- 后台任务:可以方便地集成 Celery 等任务队列处理耗时操作。
- 测试:FastAPI 提供了一套易于使用的测试客户端,方便你编写自动化测试。
总结
FastAPI 作为 Python Web 开发领域的新选择,凭借其卓越的性能、高效的开发体验、强大的数据验证和完善的异步支持,正快速获得开发者的青睐。无论你是构建 RESTful API、微服务,还是需要高性能的 Web 应用,FastAPI 都是一个值得深入学习和使用的框架。
从本文的入门示例开始,你已经迈出了拥抱 FastAPI 的第一步。现在,是时候查阅官方文档,探索更多高级特性,并将你的想法付诸实践了!