FastAPI文档美化:自定义Swagger UI的小技巧

什么是Swagger UI?

FastAPI默认使用Swagger UI作为API文档工具,它能可视化展示你的API接口,让开发者轻松测试和理解接口参数与返回结果。但默认界面可能比较单调,不够贴合项目风格。自定义Swagger UI可以让文档更专业、美观,甚至添加品牌元素,提升用户体验。

一、修改基本信息:让文档更“个性化”

最基础的美化是修改Swagger UI的标题、描述、版本等信息,这些参数直接在创建FastAPI应用时设置即可。

示例代码

from fastapi import FastAPI

app = FastAPI(
    title="我的在线图书API",  # Swagger UI顶部标题
    description="这是一个管理图书信息的API,支持增删改查。\n**文档更新日期**:2023-10-01",  # 描述文本(支持换行)
    version="1.0.0",  # API版本
    terms_of_service="https://example.com/terms",  # 服务条款链接
    contact={  # 联系方式
        "name": "开发团队",
        "email": "dev@example.com"
    }
)

@app.get("/books")
def get_books():
    return [{"id": 1, "title": "Python入门", "author": "张三"}]

效果:访问/docs后,Swagger UI顶部会显示你设置的标题、描述和版本,右侧还会出现联系方式和服务条款链接。

二、自定义主题样式:让界面更“好看”

默认Swagger UI是蓝白配色,你可以通过CSS修改背景、按钮颜色、字体等,打造独特风格。以下是两种简单方法:

方法1:直接注入CSS(适合快速修改)

通过中间件在Swagger UI页面加载时注入自定义CSS,无需额外创建文件。

示例代码

from fastapi import Request, FastAPI
from fastapi.responses import HTMLResponse

app = FastAPI()

@app.middleware("http")
async def custom_swagger_css(request: Request, call_next):
    response = await call_next(request)
    # 仅对Swagger UI页面生效
    if request.url.path == "/docs" and response.status_code == 200:
        # 注入自定义CSS
        custom_css = """
        <style>
            /* 背景颜色 */
            body {
                background-color: #f8f9fa;
                font-family: "Microsoft YaHei", sans-serif;  /* 换字体 */
            }
            /* 顶部导航栏颜色 */
            .swagger-ui .topbar {
                background-color: #2c3e50;
            }
            /* 按钮颜色 */
            .btnTry {
                background-color: #3498db;
                color: white;
                border-color: #2980b9;
            }
            /* 按钮 hover 效果 */
            .btnTry:hover {
                background-color: #2980b9;
            }
            /* 标题颜色 */
            h2 {
                color: #2c3e50;
            }
        </style>
        """
        # 将CSS插入到HTML的<head>标签后
        body = response.body.decode()
        head_start = body.find("<head>")
        if head_start != -1:
            new_body = body[:head_start+5] + custom_css + body[head_start+5:]
            response.body = new_body.encode()
    return response

效果:背景变为浅灰色,顶部导航栏变黑,按钮和标题颜色也会变化。

方法2:使用静态文件注入CSS(适合复杂样式)

如果需要更复杂的样式(如自定义Logo、背景图),可以将CSS放在静态文件中。

  1. 创建静态文件目录:在项目根目录下新建static文件夹,并放入custom.css
   /* static/custom.css */
   /* 替换Swagger默认Logo */
   .swagger-ui .topbar .link img {
       content: url('/static/logo.png'); /* 替换为你的Logo路径 */
       height: 30px;
       width: auto;
   }
   /* 修改按钮颜色 */
   .btnExecute {
       background-color: #4CAF50 !important;
       border-color: #45a049 !important;
   }
   /* 调整字体大小 */
   .swagger-ui .opblock .section {
       font-size: 14px;
   }
  1. 在FastAPI中关联静态文件
   from fastapi.staticfiles import StaticFiles

   app.mount("/static", StaticFiles(directory="static"), name="static")
  1. 注入CSS到Swagger UI:通过在HTML中添加<link>标签引入自定义CSS(需在中间件或模板中处理,也可直接在Swagger UI的HTML模板中硬编码)。

三、隐藏敏感信息:让文档更“专业”

默认Swagger UI会展示所有字段,若需隐藏敏感信息(如密码、token),可通过以下方式:

1. 隐藏Pydantic模型字段

在Pydantic模型中用Field(exclude=True)隐藏字段:

from pydantic import BaseModel, Field

class User(BaseModel):
    id: int
    name: str
    password: str = Field(..., exclude=True)  # 隐藏password字段
2. 隐藏路径操作返回字段

在接口中用response_model_exclude指定排除的字段:

@app.get("/user", response_model_exclude=["password"])
def get_user():
    return {"id": 1, "name": "Alice", "password": "secret"}

四、进阶技巧:更深度的定制

  • 修改页面布局:通过CSS调整最大宽度(如max-width: 1200px)或隐藏侧边栏。
  • 添加自定义操作说明:在Swagger UI中添加“使用提示”,可在描述文本中用Markdown格式写注释(FastAPI支持Markdown渲染)。
  • 替换“Try it out”按钮:通过CSS修改按钮图标或文字,需结合图标字体(如Font Awesome)。

总结

自定义Swagger UI的核心是通过基本信息配置CSS样式注入模型/接口参数控制实现。初学者可从修改标题、按钮颜色等简单操作开始,逐步尝试更复杂的样式调整。记住:CSS选择器可能随Swagger UI版本变化,建议结合版本兼容性测试使用。

通过这些技巧,你的API文档不仅能清晰展示接口,还能成为项目品牌的一部分,让开发者体验更流畅!

小夜