news 2026/9/7 19:30:39

FastAPI 类完全参考指南:构造参数、核心属性与全部方法逐项解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FastAPI 类完全参考指南:构造参数、核心属性与全部方法逐项解析

FastAPI 类完全参考指南:构造参数、核心属性与全部方法逐项解析

【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi

本篇基于 FastAPI 官方参考文档(docs/en/docs/reference/fastapi.md)与仓库源码(fastapi/applications.py),对FastAPI类做逐项深度拆解:覆盖全部初始化参数及默认值、关键实例属性(openapi_versionwebhooksstatedependency_overrides)、OpenAPI 生成缓存机制、8 个 HTTP 路径操作装饰器、include_routerwebsocketfrontendon_eventmiddlewareexception_handler等全部成员。读完后你可以把这篇当作"API 应用配置速查手册",并能结合源码行号定位每个行为的实际实现位置。

一、FastAPI类是什么,如何导入

FastAPI是创建 API 应用的主入口类,继承自 Starlette 的Starlette应用类(见 应用入口):

class FastAPI(Starlette): """ `FastAPI` app class, the main entrypoint to use FastAPI. """

它比 Starlette 多提供了三类能力:

  1. 基于类型注解的自动请求校验与响应序列化(通过 Pydantic);
  2. 自动生成交互式 API 文档(OpenAPI 3.1.0,默认在/docs/redoc/openapi.json);
  3. 依赖注入系统(Depends/dependency_overrides)。

官方文档给出的标准导入方式是从fastapi包顶层直接导入:

from fastapi import FastAPI app = FastAPI()

当前仓库中的版本号为 0.141.1(见 版本定义)。

二、全部初始化参数与默认值总表

FastAPI.__init__采用纯关键字参数(全部在*之后),参数众多但分组清晰。下表汇总了源码 构造器签名 中的全部参数、类型与默认值:

2.1 基础与调试

参数类型默认值说明
debugboolFalse是否在服务器错误时返回调试 traceback
routeslist[BaseRoute] \| NoneNone直接提供路由列表;继承自 Starlette 的兼容参数,官方标注不建议在 FastAPI 中使用,应改用app.get()等路径操作装饰器(源码中已标记deprecated

2.2 OpenAPI 元数据(写入/openapi.json,在/docs可见)

参数类型默认值说明
titlestr"FastAPI"API 标题;只要openapi_url非空,源码会assert self.title,即必须提供非空标题
summarystr \| NoneNoneAPI 的简短摘要
descriptionstr""API 描述,支持 CommonMark Markdown 语法,在 Swagger UI 中渲染
versionstr"0.1.0"你的应用的版本号,不是 OpenAPI 规范版本,也不是 FastAPI 框架版本
openapi_urlstr \| None"/openapi.json"OpenAPI 文档的提供地址;设为None时不公开提供文档,且/docs/redoc自动禁用
openapi_tagslist[dict] \| NoneNone标签元数据列表,每项含namedescription(可选 Markdown)、externalDocs(含descriptionurl);列表顺序即 Swagger UI 中分组展示顺序
serverslist[dict] \| NoneNone目标服务器连接信息,每项含url(支持{变量}模板)、descriptionvariables;未提供时若存在root_path则自动补一个指向root_path的 server,否则省略该字段
terms_of_servicestr \| NoneNone服务条款 URL
contactdict \| NoneNone联系人信息,可含nameurlemail字段
license_infodict \| NoneNone许可证信息,可含name(设置后必填)、identifier(SPDX 表达式,与url互斥,OpenAPI 3.1.0 起)、url
openapi_external_docsdict \| NoneNone外部文档链接,必须含descriptionurl(合法 URL 格式)
openapi_prefixstr""已弃用,改用更贴近 ASGI 标准的root_path;传入非空值时源码会打印弃用警告(见 警告逻辑)
root_pathstr""由代理处理、应用不可见但外部客户端可见的路径前缀,影响 Swagger UI 等行为
root_path_in_serversboolTrue是否用root_path自动生成 OpenAPIservers中的 URL;设为False可禁用

2.3 文档 UI(Swagger UI / ReDoc)

参数类型默认值说明
docs_urlstr \| None"/docs"Swagger UI 交互文档路径;None禁用;openapi_urlNone时自动禁用
redoc_urlstr \| None"/redoc"ReDoc 备用文档路径;规则同上
swagger_ui_oauth2_redirect_urlstr \| None"/docs/oauth2-redirect"Swagger UI 的 OAuth2 回调端点,仅在使用 "Authorize" 按钮时相关
swagger_ui_init_oauthdict \| NoneNoneSwagger UI 的 OAuth2 初始化配置字典
swagger_ui_parametersdict \| NoneNone传给 Swagger UI 的额外初始化参数,可定制 UI 行为

2.4 路由与运行时行为

参数类型默认值说明
dependenciesSequence[Depends] \| NoneNone全局依赖列表,会应用到每一个路径操作,包括子路由中的操作
default_response_classtype[Response]JSONResponse默认响应类,如可改为ORJSONResponse
redirect_slashesboolTrue是否对尾斜杠不一致的 URL 做 307 重定向,如/items/items/
middlewareSequence[Middleware] \| NoneNone创建应用时加入的中间件列表;FastAPI 中更常用app.add_middleware()
exception_handlersdict \| NoneNone异常处理器字典;FastAPI 中更常用@app.exception_handler()装饰器
on_startupSequence[Callable] \| NoneNone启动事件处理函数列表;官方建议改用lifespan
on_shutdownSequence[Callable] \| NoneNone关闭事件处理函数列表;官方建议改用lifespan
lifespanLifespan[AppType] \| NoneNone以单个上下文管理器替代 startup/shutdown 两组函数
strict_content_typeboolTrue严格校验请求Content-Type:为True时,不带该头的带 body 请求不会被按 JSON 解析,可防御绕过 CORS 预检的 CSRF 类攻击;设为False则兼容不发Content-Type的旧客户端
**extraAny透传给 Starlette 的额外关键字参数,仅存于应用实例,FastAPI 本身不使用

2.5 OpenAPI 输出定制

参数类型默认值说明
responsesdict[int \| str, dict] \| NoneNone附加在 OpenAPI 中的额外响应声明
callbackslist[BaseRoute] \| NoneNone应用到所有路径操作的 OpenAPI 回调(仅文档用途)
webhooksAPIRouter \| NoneNoneOpenAPI 3.1 webhooks 路由(自 OpenAPI 3.1.0 / FastAPI 0.99.0 起),与callbacks不同,不依赖具体路径操作
deprecatedbool \| NoneNone将全部路径操作标记为弃用
include_in_schemaboolTrue是否将所有路径操作写入 OpenAPI
generate_unique_id_functionCallable[[APIRoute], str]generate_unique_id定制 OpenAPI 操作唯一 ID 的生成函数,对自动生成客户端/SDK 尤其有用
separate_input_output_schemasboolTrue输入输出结果不同时生成独立 schema。例如模型Item.tags: list[str] = []作为请求体时tags非必填,作为响应体时恒存在(有默认值),开启后分别生成两套 schema,提升生成客户端的精确度

构造时的关键行为(初始化主体):

  • openapi_url非空,强制titleversion非空(assert校验);
  • 内部创建self.router = APIRouter(...),并把dependenciescallbacksresponsesdeprecatedinclude_in_schemastrict_content_type等参数一并传给路由,这就是"全局参数"生效的机制;
  • exception_handlers默认注册三个内建处理器:HTTPExceptionRequestValidationErrorWebSocketRequestValidationError
  • 最后调用self.setup(),注册/openapi.json/docs/redoc、OAuth2 重定向四条内置路由(include_in_schema=False)。

一个综合示例(参数均来自源码 Doc 中的官方示例):

from fastapi import FastAPI from fastapi.responses import ORJSONResponse tags_metadata = [ { "name": "users", "description": "Operations with users. The **login** logic is also here.", }, { "name": "items", "description": "Manage items. So _fancy_ they have their own docs.", "externalDocs": { "description": "Items external docs", "url": "https://fastapi.tiangolo.com/", }, }, ] app = FastAPI( title="ChimichangApp", summary="Deadpond's favorite app. Nuff said.", description="ChimichangApp API helps you do awesome stuff. 🚀", version="0.0.1", openapi_tags=tags_metadata, contact={ "name": "Deadpoolio the Amazing", "email": "dp@x-force.example.com", }, license_info={"name": "Apache 2.0"}, default_response_class=ORJSONResponse, )

三、关键实例属性

参考文档列出的成员中,以下四个属性最常用,源码均位于 属性赋值区:

3.1openapi_version

OpenAPI 版本字符串,默认"3.1.0"只能作为属性修改,不是构造参数。用途是"骗过"不认识 3.1.0 的旧工具:

app = FastAPI() app.openapi_version = "3.0.2" # 需避免使用 3.1.0 才引入的特性

源码注释明确提醒:这是 hack 手段,因为 FastAPI 实际生成的 schema 并不会降级。

3.2webhooks

APIRouter实例(未提供时自动创建),其中定义的路径操作仅用于 OpenAPI 文档中的 webhooks 部分,不产生真实可访问的路由:

app = FastAPI() @app.webhooks.post("/payments/") async def payment_webhook(): ...

3.3state

Starlette 的State对象,整个应用生命周期内是同一个对象、不随请求变化。官方说明:多数场景应使用 FastAPI 依赖而非state,它是直接继承自 Starlette 的用法。

3.4dependency_overrides

dict[原始依赖, 替换依赖]专为测试设计:把昂贵的依赖(数据库会话、HTTP 客户端等)替换为测试版本。典型用法:

from fastapi.testclient import TestClient from main import app, get_db def override_get_db(): return TestingSession() app.dependency_overrides[get_db] = override_get_db

测试体系中的印证可参考 依赖测试教程代码 与教程文档 依赖测试。

3.5openapi():带缓存与路由版本检测的 schema 生成

openapi 方法 的调用链值得注意:

  1. 先取self.router._get_routes_version()作为路由"版本号";
  2. 仅当openapi_schema为空,或路由版本发生变化时,才调用get_openapi(...)(来自 fastapi/openapi/utils.py)重新生成;
  3. 生成时传入titleversionopenapi_versionsummarydescriptionterms_of_servicecontactlicense_inforouteswebhooks.routestagsserversseparate_input_output_schemasexternal_docs——与第二节的元数据参数一一对应;
  4. 结果缓存在self.openapi_schema,后续调用零成本返回。

/openapi.json路由本身还有一个细节:setup 中的 openapi 函数 会在响应前检查请求的root_path,若root_path_in_servers为真且servers中尚无该 URL,就把它前置插入servers列表,保证代理部署下 Swagger UI 请求地址正确。

测试侧的证据:test_openapi_schema 断言响应"openapi": "3.1.0"info.title == "FastAPI",并快照校验了externalDocs等字段。

四、路径操作方法:get/put/post/delete/options/head/patch/trace

FastAPI提供了与 HTTP 动词一一对应的 8 个装饰器方法(如 get 方法),它们本质都是薄封装:签名完全相同,仅转发到self.router.<method>(...)并带上全部参数。

各方法共享的参数集(每个方法内都有完整 Doc 注释):

参数默认值说明
path必填路径,如/items/{item_id}
response_modelNone响应类型。用途四重:文档(JSON Schema)、序列化(任意对象转 JSON)、过滤(仅返回模型定义的字段,如剔除password)、校验(返回数据不合法时 FastAPI 报 500,因为这属于 API 开发者违约)
status_codeNone默认响应状态码;直接返回 Response 可覆盖
tagsNone操作标签,写入 OpenAPI
dependenciesNone该操作的Depends()列表
summary/descriptionNone标题与描述;description未提供时自动从函数 docstring 提取,支持 Markdown
response_description"Successful Response"默认响应的描述
responsesNone额外响应声明
deprecatedNone标记弃用
operation_idNone自定义操作 ID(须全 API 唯一);可用generate_unique_id_function定制生成规则
response_model_include/response_model_excludeNone传给 Pydantic 的字段级 include/exclude
response_model_by_aliasTrue是否按 alias 序列化
response_model_exclude_unsetFalse排除"未显式设置"的字段(保留显式设置为默认值的字段)
response_model_exclude_defaultsFalse排除"值等于默认值"的字段(无论是否显式设置)
response_model_exclude_noneFalse排除None字段;比前两个更简单粗暴,官方建议优先用前两者
include_in_schemaTrue是否写入 OpenAPI
response_classJSONResponse该操作的响应类;直接返回 Response 时不生效
nameNone内部使用的操作名
callbacksNone该操作的 OpenAPI 回调(仅文档)
openapi_extraNone注入该操作 OpenAPI schema 的额外元数据
generate_unique_id_functiongenerate_unique_id覆盖全局唯一 ID 生成函数

典型用法(取自源码 docstring):

from fastapi import FastAPI app = FastAPI() @app.get("/items/") def read_items(): return [{"name": "Empanada"}, {"name": "Arepa"}]

除装饰器形式外,还有两个等价的命令式方法:

  • api_route(path, *, methods=[...], ...):装饰器形式,显式指定方法列表;
  • add_api_route(path, endpoint, ...):命令式注册,签名见 add_api_route。

测试证据:tests/test_application.py 中test_get_path用参数化用例验证了装饰器路由、非装饰器路由(add_api_route风格)与 404 行为,test_openapi_schema则快照校验了两种注册方式生成的operationId(如non_operation_api_route_get)。

五、include_router:大应用组装的核心

include_router 把APIRouter的所有路由合并进应用,独有参数及其默认值:

参数默认值说明
router必填要包含的APIRouter
prefix""路径前缀,如prefix="/users"
tagsNone应用于该路由全部操作的标签
dependenciesNone应用于该路由全部操作的依赖
responsesNone该路由级别的额外 OpenAPI 响应
deprecatedNone将该路由全部操作标记弃用
include_in_schemaTrue是否将该路由全部操作写入 OpenAPI
default_response_classJSONResponse该路由的默认响应类
callbacksNone该路由级别的 OpenAPI 回调
generate_unique_id_functiongenerate_unique_id该路由级别的唯一 ID 生成函数

示例(源码 Doc 中的官方片段):

from fastapi import Depends, FastAPI from .internal import admin app = FastAPI() app.include_router( admin.router, dependencies=[Depends(get_token_header)], )

实现上它只是委托给self.router.include_router(...),因此APIRouter自身也支持同样的参数,可多级嵌套。相关教程示例可看 docs_src/bigger_applications/ 目录与文档 Bigger Applications。

六、websocketfrontend

6.1websocket(path, name=None, *, dependencies=None)

websocket 装饰器 装饰 WebSocket 处理函数,内部调用add_api_websocket_route(其仅支持namedependencies两个额外参数)。示例:

from fastapi import FastAPI, WebSocket app = FastAPI() @app.websocket("/ws") async def websocket_endpoint(websocket: WebSocket): await websocket.accept() while True: data = await websocket.receive_text() await websocket.send_text(f"Message text was: {data}")

另有一个继承自 Starlette 的低层websocket_route(源码),仅做路由注册,不带 FastAPI 的依赖注入能力。

6.2frontend(path, *, directory, fallback="auto", check_dir="auto")

frontend 方法 用于把前端静态构建产物(如dist/)作为低优先级路由提供服务:FastAPI 路径操作优先匹配,只有没有普通路由命中时才回落到前端文件——因此 API 与 SPA 可共存于同一应用:

app = FastAPI() app.frontend("/", directory="dist")

参数要点:

  • directory:静态构建产物所在目录;
  • fallback:缺失路径的回退文件,取值为"auto"/"index.html"/"404.html"/None
  • check_dir:创建应用时是否检查目录存在;"auto"时若环境变量FASTAPI_ENV"development"fastapi dev命令会自动设置)则跳过检查并给出警告,否则严格检查。

七、on_event(已弃用)、middlewareexception_handler

7.1on_event:已弃用,改用lifespan

on_event("startup")/on_event("shutdown")已标记deprecated(源码),官方推荐用lifespan上下文管理器参数:

from contextlib import asynccontextmanager @asynccontextmanager async def lifespan(app): # 启动逻辑(替代 on_event("startup")) yield # 关闭逻辑(替代 on_event("shutdown")) app = FastAPI(lifespan=lifespan)

7.2middleware("http")装饰器

middleware 方法 当前仅支持http类型,装饰器内部等价于self.add_middleware(BaseHTTPMiddleware, dispatch=func)。官方 docstring 示例:

import time from typing import Awaitable, Callable from fastapi import FastAPI, Request, Response app = FastAPI() @app.middleware("http") async def add_process_time_header(request: Request, call_next): start_time = time.time() response = await call_next(request) process_time = time.time() - start_time response.headers["X-Process-Time"] = str(process_time) return response

注意中间件栈的组装细节在 build_middleware_stack:FastAPI 覆写了 Starlette 的同名方法,在外层ServerErrorMiddleware与用户中间件之内、ExceptionMiddleware之下额外插入了一层AsyncExitStackMiddleware,用于在保持contextvars上下文一致的前提下正确关闭文件等资源。

7.3exception_handler装饰器

exception_handler 方法 接收异常类或状态码,装饰器内部调用self.add_exception_handler(...)。docstring 示例(自定义异常 → 418 响应):

from fastapi import FastAPI, Request from fastapi.responses import JSONResponse class UnicornException(Exception): def __init__(self, name: str): self.name = name app = FastAPI() @app.exception_handler(UnicornException) async def unicorn_exception_handler(request: Request, exc: UnicornException): return JSONResponse( status_code=418, content={"message": f"Oops! {exc.name} did something."}, )

八、源码结构小结与延伸阅读

  • 类实现全部集中在 fastapi/applications.py:构造器(L58-L1018)、中间件栈(L1020-L1068)、openapi()(L1070-L1103)、setup()内置路由(L1105-L1158)、frontend(L1222)、include_router(L1441)、HTTP 动词方法(L1646 起)、on_event/middleware/exception_handler(L4654-L4774)。
  • OpenAPI 生成的底层逻辑在 fastapi/openapi/utils.py,文档 UI 的 HTML 模板在 fastapi/openapi/docs.py。
  • 内置文档端点的行为由 tests/test_application.py 固化:/docs返回含swagger-ui-dist的 HTML、/redoc返回 ReDoc 页面、/docs/oauth2-redirect返回 OAuth2 回调页、/openapi.json的完整 schema 以 inline_snapshot 快照断言。
  • 与本文各主题对应的官方教程(英文文档,本仓库内可直接查看):元数据与文档 URL、中间件、错误处理、更大型应用、依赖测试。

掌握上述参数与方法的分工后,一个常见的心智模型是:构造参数决定"应用是什么"(元数据、文档开关、全局依赖、响应类),装饰器方法决定"应用提供什么"(HTTP/WebSocket 端点、路由组装),属性与命令式方法决定"应用如何被观察和替换"(OpenAPI 版本覆盖、webhooks 路由、依赖覆盖、异常与中间件扩展)。

【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 19:30:21

太赫兹UM-MIMO与IRS混合信道估计:球面波与平面波联合稀疏恢复

最近这个太赫兹集成UM-MIMO和IRS系统的混合信道估计项目在仿真圈子里讨论度挺高&#xff0c;版本编号都出到14942期了。我也照着思路自己完整跑了一遍&#xff0c;把代码结构、信道建模、字典设计这些核心环节都重新捋清楚了。这个项目本质上不是单纯调一个函数就能出结果的dem…

作者头像 李华
网站建设 2026/9/7 19:29:21

css实现图片大小自适应

方法一&#xff1a;css的background属性来设置背景图知识点总结background的属性有以下这些&#xff1a; background-colorbackground-positionbackground-sizebackground-repeatbackground-originbackground-clipbackground-attachmentbackground-image1.background-color就不…

作者头像 李华
网站建设 2026/9/7 19:28:49

猫抓cat-catch安装使用教程:3分钟下载网页视频资源的完整流程

猫抓cat-catch安装使用教程&#xff1a;3分钟下载网页视频资源的完整流程 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓&#xff08;cat-cat…

作者头像 李华
网站建设 2026/9/7 19:26:17

企业采购AI内容系统的避坑指南:交付方式怎么选

![商务谈判](https://images.pexels.com/photos/7153223/pexels-photo-7153223.jpeg?autocompress&cstinysrgb&w1080)*图源&#xff1a;Pexels didsss&#xff08;免费商用授权&#xff09;* 企业采购 AI 内容系统&#xff0c;最贵的错误不是买贵了&#xff0c;而是买…

作者头像 李华
网站建设 2026/9/7 19:25:34

2026年论文AI率100%怎么降?实测8款工具红黑榜

论文AI率拉到100%&#xff0c;导师那边直接打回重写&#xff0c;这种崩溃经历过一次就够受的。整段复制AI生成内容、改写工具选错、或者改完没验证&#xff0c;都可能让检测结果直接飙满。这次实测了8款降AI率工具&#xff0c;同一篇AI生成的论文样本挨个过&#xff0c;哪些真能…

作者头像 李华