fastapi个人学习记录

FastAPI快速入门指南

FastAPI是一个现代、快速(高性能)的Python Web框架,用于构建API。本指南将介绍FastAPI的基本概念和使用方法,帮助您快速上手这个强大的工具。

目录

  1. 安装
  2. 创建第一个API
  3. 运行服务器
  4. 路径参数
  5. 查询参数
  6. 请求体
  7. 自动API文档
  8. 总结

安装

首先,您需要安装FastAPI和一个ASGI服务器(如Uvicorn)。在命令行中运行以下命令:

pip install fastapi
pip install uvicorn

创建第一个API

让我们创建一个简单的FastAPI应用程序。创建一个名为main.py的文件,并添加以下代码:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

这段代码创建了一个基本的FastAPI应用,并定义了一个根路由("/"),当访问时返回一个JSON响应。

运行服务器

要运行您的FastAPI应用,使用以下命令:

uvicorn main:app --reload

现在,您可以在浏览器中访问 http://127.0.0.1:8000 ,将看到 {"message": "Hello World"} 的JSON响应。

路径参数

路径参数是URL路径中的变量部分。FastAPI允许您轻松定义和使用这些参数。

基本用法

@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

在这个例子中,item_id 是一个路径参数。FastAPI会自动解析URL中的值并将其转换为指定的类型(这里是 int)。

多个路径参数

您可以在一个路由中定义多个路径参数:

@app.get("/users/{user_id}/items/{item_id}")
async def get_user_item(user_id: int, item_id: str):
    return {"user_id": user_id, "item_id": item_id}

这个路由将匹配如 "/users/42/items/foo" 的URL。

路径参数验证

FastAPI支持使用Pydantic的字段验证:

from fastapi import Path

@app.get("/items/{item_id}")
async def read_item(item_id: int = Path(..., ge=1, le=1000)):
    return {"item_id": item_id}

这个例子确保 item_id 在1到1000之间。

预定义值

您可以使用Enum来限制路径参数的可能值:

from enum import Enum

class ModelName(str, Enum):
    alexnet = "alexnet"
    resnet = "resnet"
    lenet = "lenet"

@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
    if model_name == ModelName.alexnet:
        return {"model_name": model_name, "message": "Deep Learning FTW!"}
    if model_name.value == "lenet":
        return {"model_name": model_name, "message": "LeCNN all the images"}
    return {"model_name": model_name, "message": "Have some residuals"}

这确保 model_name 只能是 "alexnet"、"resnet" 或 "lenet"。

查询参数

查询参数是URL中问号后面的键值对。FastAPI让处理这些参数变得简单直观。

基本用法

@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

这个路由可以处理如 "/items/?skip=20&limit=30" 的请求。如果未提供参数,将使用默认值。

可选参数

将参数类型声明为可选可以使查询参数成为可选的:

from typing import Optional

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

这里,q 是一个可选的查询参数。

多个参数

您可以定义任意数量的查询参数:

@app.get("/users/")
async def read_users(skip: int = 0, limit: int = 10, sort: Optional[str] = None):
    return {"skip": skip, "limit": limit, "sort": sort}

这个路由可以处理如 "/users/?skip=20&limit=30&sort=name" 的请求。

参数验证

与路径参数类似,您也可以对查询参数进行验证:

from fastapi import Query

@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, min_length=3, max_length=50)):
    results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
    if q:
        results.update({"q": q})
    return results

这确保当提供 q 参数时,其长度在3到50个字符之间。

布尔类型转换

FastAPI会自动处理布尔类型的查询参数:

@app.get("/items/")
async def read_items(item_id: str, is_available: bool = False):
    return {"item_id": item_id, "is_available": is_available}

请求 "/items/?item_id=foo&is_available=1" 或 "/items/?item_id=foo&is_available=true" 都会将 is_available 设置为 True

多值查询参数

有时您可能需要接收同一参数的多个值:

from typing import List

@app.get("/items/")
async def read_items(q: Optional[List[str]] = Query(None)):
    query_items = {"q": q}
    return query_items

这允许处理如 "/items/?q=foo&q=bar" 的请求,其中 q 将是一个包含 "foo" 和 "bar" 的列表。

通过这些详细的示例和解释,您应该能够更好地理解和使用FastAPI中的路径参数和查询参数。这些功能允许您创建灵活和强大的API端点,能够精确地处理各种类型的请求和数据。记住,FastAPI的类型提示不仅提供了类型检查,还为您的API提供了自动文档生成和请求验证功能。

请求体

请求体是客户端发送到API的数据。在FastAPI中,请求体通常用于POST、PUT和PATCH请求,用来发送更复杂的数据结构。FastAPI使用Pydantic模型来定义、验证和序列化请求体。

基本用法

首先,让我们创建一个基本的请求体模型:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

@app.post("/items/")
async def create_item(item: Item):
    return item

在这个例子中,Item 类定义了请求体的结构。当客户端发送POST请求到 "/items/" 时,FastAPI会自动解析JSON请求体并验证数据。

嵌套模型

您可以创建更复杂的嵌套模型:

class Image(BaseModel):
    url: str
    name: str

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
    tags: list[str] = []
    image: Image = None

@app.post("/items/")
async def create_item(item: Item):
    return item

这允许您处理包含嵌套结构的JSON数据。

使用请求体和路径参数

您可以同时使用请求体和路径参数:

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    return {"item_id": item_id, **item.dict()}

这个例子展示了如何更新特定ID的项目。

请求体 + 路径 + 查询参数

FastAPI允许您结合使用请求体、路径参数和查询参数:

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item, q: str = None):
    result = {"item_id": item_id, **item.dict()}
    if q:
        result.update({"q": q})
    return result

多个请求体参数

有时,您可能需要在一个请求中接收多个相关的请求体:

class User(BaseModel):
    username: str
    full_name: str = None

@app.post("/items/{item_id}")
async def update_item(item_id: int, item: Item, user: User):
    results = {"item_id": item_id, "item": item, "user": user}
    return results

在这个例子中,FastAPI会期望一个包含 itemuser 字段的JSON对象。

请求体中的字段验证

Pydantic提供了强大的字段验证功能:

from pydantic import BaseModel, Field

class Item(BaseModel):
    name: str
    description: str = Field(None, max_length=300)
    price: float = Field(..., gt=0)
    tax: float = Field(None, ge=0)

@app.post("/items/")
async def create_item(item: Item):
    return item

这个例子使用 Field 来添加额外的验证:

  • description 的最大长度为300个字符
  • price 必须大于0
  • tax(如果提供)必须大于或等于0

使用 Enum 类

您可以使用 Enum 来限制字段的可能值:

from enum import Enum

class Color(str, Enum):
    red = "red"
    green = "green"
    blue = "blue"

class Item(BaseModel):
    name: str
    color: Color

@app.post("/items/")
async def create_item(item: Item):
    return item

这确保 color 只能是 "red"、"green" 或 "blue"。

使用 List 和 Set

Pydantic 模型可以包含列表和集合:

from typing import List, Set

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tags: List[str] = []
    unique_tags: Set[str] = set()

@app.post("/items/")
async def create_item(item: Item):
    return item

这允许您处理包含数组和唯一值集合的JSON数据。

响应模型

您可以使用 Pydantic 模型来定义响应的结构:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

class ItemOut(BaseModel):
    name: str
    price: float
    tax: float

@app.post("/items/", response_model=ItemOut)
async def create_item(item: Item):
    return item

在这个例子中,即使函数返回完整的 item,响应将只包含 ItemOut 模型中定义的字段。

通过这些详细的示例和解释,您应该能够更好地理解和使用FastAPI中的请求体。请求体允许您处理复杂的数据结构,同时利用Pydantic的强大功能进行数据验证和序列化。这不仅简化了API的开发过程,还提高了API的稳定性和可靠性。

自动API文档

FastAPI自动为您的API生成交互式文档。启动您的应用后:

posted @ 2024-07-11 00:27  TsayDust  阅读(11)  评论(0编辑  收藏  举报