FastAPI系列15:API文档的定制和美化


在前面的内容里,我们详细讨论了FastAPI的各个方面,作为一个web框架,FastAPI却把“API”放在了名称之中,强调了它对于API的专注,而这一点可以在它的API文档定制和美化功能上得到很好的体现。

FastAPI 支持的文档规范

FastAPI 支持三种形式的自动生成 API 文档界面,基于 OpenAPI 规范(前身为 Swagger),开发者可以无需手动维护文档,大大提升开发效率和文档质量。

Swagger UI (/docs)

  • 提供可交互的 API 文档界面
  • 支持「Try it out」在线测试请求
  • 自动读取接口信息、参数类型、示例等

ReDoc (/redoc)

  • 更简洁优雅的文档样式(只读、不可测试)
  • 更适合阅读文档/接口说明,不适合调试请求
  • 支持嵌套结构美观展示

OpenAPI JSON (/openapi.json)

  • 纯 JSON 格式,定义了 API 的结构、模型、路径、参数
  • 可被工具(如 Swagger Codegen、Postman、第三方客户端)解析自动生成代码

文档全局配置

1、定义API文档的基础信息

app = FastAPI(
	# API 的标题
    title="商城后台 API",
    # Swagger 路径,可通过`docs_url=None`禁用
	docs_url="/swagger",   
	# ReDoc 路径,可通过`redoc_url=None`禁用
    redoc_url="/docs-ui",   
    # OpenAPI 描述文档路径,可通过`openapi_url=None`禁用
    openapi_url="/api/openapi.json" 
    # API 的简短摘要。
    summary="本API接口主要为商城APP提供的"
    # API 的版本。这是您自己的应用程序的版本,而不是 OpenAPI 的版本。
    version="1.0.0"
    # API 的简短描述。可以使用Markdown。
    description="包括管理用户、订单和商品的接口集合",
    # API 服务条款的 URL。如果提供,则必须是 URL。
    terms_of_service="http://example.com/terms/", 
    # 公开的 API 的联系信息。它可以包含多个字段。
    contact={ 
	    "name": "geekabc", 
	    "url": "http://geekabc.example.com/contact/", 
	    "email": "geekabc@example.com"
	}, 
	# 公开的 API 的许可证信息。它可以包含多个字段。
	license_info={ 
		"name": 
		"Apache 2.0", 
		"url": "https://www.apache.org/licenses/LICENSE-2.0.html"
	},

)

2、定义和使用接口Tag分组

tags_metadata = [{ 
		"name": "users", 
		"description": "用户管理模块", 
	}, { 
		"name": "items", 
		"description": "商品管理模块", 
		"externalDocs": { 
			"description": "外部文档说明", 
			"url": "https://fastapi.tiangolo.com/", 
		}
	}]

app = FastAPI(openapi_tags=tags_metadata)


@app.get("/users/", tags=["users"])
def get_users():
    return ["user1", "user2"]

@app.post("/items/", tags=["items"])
def create_item(item: Item):
    return item

接口文档美化

1、为接口写明 summary 和 description 描述

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/", summary="获取商品列表", description="此接口用于分页获取所有商品信息。")
def read_items():
    return [{"name": "Item1"}]

2、为接口参数写清晰的说明(含路径/查询/请求体/头部)

from fastapi import Query, Path

@app.get("/items/{item_id}")
def read_item(
    item_id: int = Path(..., title="商品ID", description="商品的唯一标识"),
    q: str = Query(None, description="搜索关键词", example="laptop")
):
    return {"item_id": item_id, "q": q}

3、为接口参数加类型注解和默认值(减少文档歧义)

def search_items(q: str = Query("", min_length=1, max_length=20, description="搜索关键词")):
    ...

4、为枚举类型接口参数写明可选值范围

from fastapi import FastAPI, Query
from enum import Enum

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

app = FastAPI()

@app.get("/items/")
def get_items(color: ColorEnum = Query(..., description="颜色选项")):
    return {"selected_color": color}

5、为请求体字段添加标题、描述、示例

from pydantic import BaseModel, Field

class Item(BaseModel):
    name: str = Field(..., title="商品名称", description="商品的名称,必填", example="MacBook Pro")
    price: float = Field(..., gt=0, description="商品价格,必须大于0", example=1999.99)

6、为请求模型中添加全局示例(多个 example)

class Item(BaseModel):
    name: str
    price: float

    class Config:
        schema_extra = {
            "examples": {
                "normal": {
                    "summary": "普通商品",
                    "value": {
                        "name": "手机",
                        "price": 1000
                    }
                },
                "discount": {
                    "summary": "打折商品",
                    "value": {
                        "name": "打折手机",
                        "price": 800
                    }
                }
            }
        }

7、自定义接口响应格式(Response Model + 响应说明)

from pydantic import BaseModel
from fastapi.responses import JSONResponse

class Result(BaseModel):
    code: int
    msg: str
    data: dict | None
    class Config:
        schema_extra = {
            "example": {
                "code": 0,
                "msg": "操作成功",
                "data": {"id": 1, "name": "Item1"}
            }
        }

@app.get("/ping", response_model=Result, summary="健康检查")
def ping():
    return {"code": 0, "msg": "pong", "data": None}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值