FastAPI入门:Python开发者必学的Web框架基础

什么是Web框架和FastAPI?

在开始之前,我们先搞清楚几个基础概念:

Web框架:简单来说,Web框架就是帮你快速搭建Web应用的工具。它封装了处理HTTP请求、路由、数据处理等复杂细节,让你能专注于业务逻辑。想象一下,如果没有框架,你需要自己处理socket连接、解析HTTP协议、路由分发等,这会非常繁琐。

FastAPI:这是一个基于Python的现代Web框架,它的核心特点是高性能(基于Starlette和Pydantic)、自动生成API文档(Swagger UI和ReDoc)、支持异步编程(适合高并发场景),以及数据验证。对于Python开发者来说,FastAPI已经成为构建RESTful API的首选框架之一。

安装与基础示例

安装FastAPI和服务器

FastAPI本身是Python库,但需要一个ASGI服务器来运行(类似Django的Gunicorn+Uvicorn)。这里我们用Uvicorn作为服务器:

pip install fastapi uvicorn

第一个“Hello World”应用

创建一个main.py文件,输入以下代码:

from fastapi import FastAPI

# 创建FastAPI应用实例
app = FastAPI()

# 定义路由:当访问根路径("/")时触发
@app.get("/")
def read_root():
    return {"message": "Hello, FastAPI!"}

运行应用

在终端执行:

uvicorn main:app --reload
  • main:app:表示从main.py文件中导入名为app的FastAPI实例
  • --reload:自动检测代码变化并重启服务器,方便开发

现在打开浏览器访问 http://localhost:8000,就能看到返回的JSON数据:{"message": "Hello, FastAPI!"}

路由与参数

路径参数

你可以在URL中定义动态参数,比如获取用户ID的接口:

@app.get("/users/{user_id}")
def get_user(user_id: int):  # 参数类型为int,自动验证
    return {"user_id": user_id, "message": f"User {user_id} data"}
  • 访问 http://localhost:8000/users/123,会返回 {"user_id": 123, "message": "User 123 data"}
  • FastAPI会自动验证参数类型(如user_id必须是整数,否则返回错误)

查询参数

如果需要传递可选参数,可以用查询参数:

@app.get("/search")
def search_items(query: str = None, limit: int = 10):
    return {"query": query, "limit": limit}
  • 访问 http://localhost:8000/search?query=book&limit=5,返回 {"query": "book", "limit": 5}
  • 参数默认值(如query: str = None)表示该参数可选

数据验证与Pydantic

FastAPI使用Pydantic库进行数据验证和序列化,确保请求数据符合预期格式。

定义数据模型

创建一个Item模型:

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None  # 可选字段,默认None

使用模型接收请求数据

@app.post("/items/")
def create_item(item: Item):
    return {"item_name": item.name, "item_price": item.price}
  • 当发送POST请求到/items/,并在请求体中传入JSON数据(如{"name": "apple", "price": 5.99})时,FastAPI会自动验证数据类型
  • 如果数据格式错误(如price写成字符串),会返回清晰的错误提示

请求方法与数据处理

GET vs POST

  • GET:用于获取数据(如查询列表),参数放在URL中,不适合提交敏感数据
  • POST:用于提交数据(如创建资源),参数放在请求体中,更安全

处理POST请求(JSON数据)

用上面定义的Item模型处理JSON数据:

@app.post("/items/")
def create_item(item: Item):
    return {"message": f"Created {item.name}", "price": item.price}

处理表单数据

如果是HTML表单提交,用Form类:

from fastapi import Form

@app.post("/login")
def login(username: str = Form(...), password: str = Form(...)):
    return {"username": username, "status": "logged in"}
  • Form(...)表示该参数必填,用户提交表单时会自动解析

自动生成API文档

FastAPI最实用的特性之一是自动生成交互式API文档,不需要手动写文档!

访问Swagger UI

运行应用后,访问 http://localhost:8000/docs,就能看到可视化的API文档界面:

  • 可以直接在页面上测试所有接口(点击”Try it out”)
  • 自动显示参数说明、返回格式和示例数据

ReDoc文档

访问 http://localhost:8000/redoc,是另一种格式的API文档,更简洁直观。

异步支持(进阶了解)

FastAPI支持异步编程,适合处理耗时操作(如数据库查询、外部API调用):

from fastapi import FastAPI
import asyncio

app = FastAPI()

@app.get("/async-data")
async def get_async_data():
    # 模拟异步操作(如数据库查询)
    await asyncio.sleep(1)  # 等待1秒
    return {"data": "This is async response"}
  • 异步接口使用async def定义,配合await关键字
  • 高并发场景下,异步能显著提升性能

总结与实践建议

FastAPI的核心优势在于简单易用自动生成文档,非常适合快速开发RESTful API。

初学者实践步骤:

  1. 安装FastAPI和Uvicorn
  2. 完成基础示例(Hello World、路径参数、查询参数)
  3. 使用Pydantic模型处理数据验证
  4. 尝试编写GET和POST接口,测试API文档
  5. 用异步函数处理简单耗时操作

进阶方向:

  • 中间件(Middleware):处理所有请求/响应
  • 依赖注入(Dependency Injection):复用代码逻辑
  • 数据库集成(SQLAlchemy/FastAPI-SQLAlchemy)
  • 中间件和CORS配置(处理跨域请求)

FastAPI的学习曲线平缓,从基础到进阶可以逐步扩展,建议结合官方文档和实际项目练习,很快就能上手!

小夜