ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FastAPI 官方入门详解:从安装、示例 API 到自动文档与性能基准

FastAPI 官方入门详解:从安装、示例 API 到自动文档与性能基准 FastAPI 官方入门详解从安装、示例 API 到自动文档与性能基准【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapiFastAPI 是官方文档首页docs/de/docs/index.md所定义的现代、高速高性能Python Web 框架其核心思路是用标准 Python 类型注解声明参数、请求体和返回值从而同时获得数据校验、类型转换、编辑器智能提示和自动交互文档。本篇基于仓库中的官方首页文档展开并结合 pyproject.toml、fastapi/applications.py、fastapi/cli.py 等源码逐条印证读完你可以独立完成安装 → 创建示例 API → 启动开发服务器 → 验证 JSON 响应 → 使用 Swagger UI/ReDoc 交互调试 → 升级带 Pydantic 请求体的版本 → 部署的完整闭环。FastAPI 是什么核心特性一览官方首页对 FastAPI 的定位是基于标准 Python 类型提示type hints构建 API 的现代、快速 Web 框架。其关键特性包括快速Schnell非常高的运行性能与 NodeJS、Go 处于同一梯队得益于 Starlette 和 Pydantic是可用 Python 框架中最快的之一见性能一节。开发速度快官方内部开发团队估算开发功能的速度可提升约 200%300%人为开发者导致的错误可减少约 40%。注意原文标注这是基于内部团队生产应用测试的估算值而非独立基准。直观出色的编辑器支持处处可用代码补全Auto-Complete / IntelliSense减少调试时间。简单设计为易学易用减少查阅文档的时间。简短最小化代码重复单个参数声明即可带出多项能力减少 Bug。健壮直接产出生产级代码附带自动交互式文档。基于标准完全兼容 OpenAPI原 Swagger与 JSON Schema 两大开放标准。从源码结构看框架本体入口 fastapi/init.py 中当前版本为0.141.1并对外导出FastAPI、APIRouter、HTTPException、Depends、Query、Body、Form、File、UploadFile、BackgroundTasks、WebSocket等最常用的 API 面——也就是说首页文档中承诺的路径参数、查询参数、请求体、文件上传、依赖注入、后台任务、WebSocket这些能力都是包级公开接口而非隐藏机制。技术底座Starlette 与 Pydantic首页要求一节明确写道FastAPI 站在巨人的肩膀上——Starlette承担所有 Web 层能力ASGI 应用、路由、中间件、WebSocket 等Pydantic承担所有数据层能力类型校验、序列化、嵌套模型。这一点在 fastapi/applications.py 中可以直接验证class FastAPI(Starlette)直接继承 Starlette 的应用类并在构造函数中内置 OpenAPI 文档生成get_swagger_ui_html、get_redoc_html、get_openapi与请求校验异常处理器。pyproject.toml 中声明的硬性依赖与版本下限为依赖版本约束pyproject.toml作用starlette0.46.0Web 层ASGI框架pydantic2.9.0数据校验与序列化v2typing-extensions4.8.0类型系统扩展typing-inspection0.4.2运行时类型注解检查annotated-doc0.0.2为参数提供文档说明Doc同时 pyproject.toml 声明requires-python 3.10分类器中标注支持 Python 3.103.14并声明Framework :: AsyncIO——即示例中async def路径的一等支持。安装fastapi[standard]与依赖组官方首页推荐的安装方式是先安装uv再执行$ uv add fastapi[standard]官方特别提醒fastapi[standard]务必加引号否则在 Windows 等终端中会被当作重定向。若偏好pip则在虚拟环境中安装fastapi[standard]替代步骤见文档站教程中的安装 FastAPI章节仓库中对应 docs_src/first_steps/tutorial001_py310.py 所服务的 tutorial 安装小节。standard可选依赖组到底装了什么首页列出了standard组的内容pyproject.toml 的[project.optional-dependencies].standard给出了精确清单可以按谁在用归类Pydantic 使用email-validator2.0.0EmailStr等邮箱字段校验。Starlette 使用httpx0.23.0,1.0.0使用TestClient做应用测试时必需jinja23.1.5使用默认模板配置fastapi.templating.Jinja2Templates时必需python-multipart0.0.18用request.form()解析表单时必需。FastAPI 使用uvicorn[standard]0.12.0加载并运行你的应用的 ASGI 服务器[standard]额外引入uvloop等高并发部署所需组件fastapi-cli[standard]0.0.32提供fastapi命令行其中包含fastapi-cloud-cli用于把应用部署到 FastAPI Cloud。Pydantic 生态的额外可选件同样在standard组内pydantic-settings2.0.0配置管理pydantic-extra-types2.0.0Pydantic 的附加数据类型。此外standard组还包含fastar0.9.0用于文件上传相关的性能优化源码清单中可见文档首页未单独展开。三种安装形态首页还给出两个变体与 pyproject.toml 中的可选依赖组一一对应不含standarduv add fastapi——只安装核心硬依赖上表五项适合自管服务器/测试客户端的场景不含fastapi-cloud-cliuv add fastapi[standard-no-fastapi-cloud-cli]——保留其余标准依赖但剔除云部署 CLI对应standard-no-fastapi-cloud-cli依赖组fastapi-cli[standard-no-fastapi-cloud-cli]完整版all额外引入itsdangerousStarletteSessionMiddleware用与pyyamlStarlette 的 schema 生成用适合需要 Starlette 完整能力的场景。关于 CLI 的可用性有一个源码级细节fastapi/cli.py 会尝试从fastapi_cli.cli导入真正的命令行入口若未安装fastapi[standard]则打印提示并抛出RuntimeError要求执行pip install fastapi[standard]。这解释了为什么fastapi dev/fastapi deploy等命令必须搭配standard组使用。示例 API最小可运行程序创建main.py首页示例的最小应用如下from fastapi import FastAPI app FastAPI() app.get(/) def read_root(): return {Hello: World} app.get(/items/{item_id}) def read_item(item_id: int, q: str | None None): return {item_id: item_id, q: q}这个文件对应的可运行源码就在仓库中docs_src/first_steps/tutorial001_py310.py该版本使用async def与{message: Hello World}响应。异步写法如果你的代码使用async/await就把处理函数改成async deffrom fastapi import FastAPI app FastAPI() app.get(/) async def read_root(): return {Hello: World} app.get(/items/{item_id}) async def read_item(item_id: int, q: str | None None): return {item_id: item_id, q: q}关于async/await的取舍官方指向文档站异步章节的赶时间小节。从 fastapi/applications.py 的依赖注入体系可以推断同步函数会被放到线程池中执行异步函数则在事件循环中执行两种写法都能正确工作关键取决于你的 I/O 库是否支持await。启动开发服务器$ uv run fastapi dev输出来自首页文档╭────────── FastAPI CLI - Development mode ───────────╮ │ Serving at: http://127.0.0.1:8000 │ │ API docs: http://127.0.0.1:8000/docs │ │ Running in development mode, for production use: │ │ fastapi run │ ╰─────────────────────────────────────────────────────╯ INFO: Will watch for changes in these directories: [/home/user/code/awesomeapp] INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRLC to quit) INFO: Started reloader process [2248755] using WatchFiles INFO: Started server process [2248757] INFO: Waiting for application startup. INFO: Application startup complete.fastapi dev的行为在首页有明确说明它自动读取当前目录的main.py识别其中的 FastAPI 应用实例然后用 Uvicorn 启动服务器默认开启 WatchFiles 文件监听自动重载对应上面日志中的 reloader 进程方便本地开发。生产环境则使用fastapi run。验证请求打开浏览器访问http://127.0.0.1:8000/items/5?qsomequery得到 JSON 响应{item_id: 5, q: somequery}此时你的 API 已经具备在/与/items/{item_id}两个路径上接收 HTTP 请求两个路径都支持GET操作HTTP 方法/items/{item_id}含路径参数item_id声明为int/items/{item_id}含可选的字符串查询参数q。仓库的测试套件对这类示例应用有直接覆盖tests/test_tutorial/test_first_steps/test_tutorial001_tutorial002_tutorial003.py 用TestClient断言GET /返回 200 与{message: Hello World}、GET /nonexistent返回 404 与{detail: Not Found}——后者也顺带印证了路径参数缺失/类型不符时客户端能看到清晰错误这一特性在异常处理器中的实现路径。自动交互文档Swagger UI 与 ReDoc启动后无需任何额外配置访问两个地址即可http://127.0.0.1:8000/docs——Swagger UI 提供的自动交互文档http://127.0.0.1:8000/redoc——ReDoc 提供的替代版自动文档从源码看这两套文档页面由 fastapi/applications.py 引入的get_swagger_ui_html、get_redoc_html与 OAuth2 重定向页get_swagger_ui_oauth2_redirect_html生成底层数据则是get_openapi产出的 OpenAPI Schema当前测试快照显示生成的是 OpenAPI 3.1.0见上文测试文件。测试文件中的test_openapi_schema断言/openapi.json返回3.1.0规范、含paths./get与operationId: root__get——这正是两份文档 UI 的数据源。示例升级引入 Pydantic 请求体在main.py中加入PUT请求体处理用 Pydantic 声明 Bodyfrom fastapi import FastAPI from pydantic import BaseModel app FastAPI() class Item(BaseModel): name: str price: float is_offer: bool | None None app.get(/) def read_root(): return {Hello: World} app.get(/items/{item_id}) def read_item(item_id: int, q: str | None None): return {item_id: item_id, q: q} app.put(/items/{item_id}) def update_item(item_id: int, item: Item): return {item_name: item.name, item_id: item_id}fastapi dev会自动重载该改动。回到/docs交互文档自动出现新的 PUT 接口与 Body 结构点击Try it out即可在页面内填写参数并直接调用 API点击Execute后UI 与后端通信、发送参数、接收结果并展示在页面上。/redoc替代文档同样会反映新的查询参数与 Body。一次类型声明带来的能力官方总结首页Zusammenfassung小结一节是全文的骨架性总结你只需用标准 Python 类型把参数/请求体声明一次无需学习框架私有语法、方法或类。一次声明即可得到编辑器支持补全、类型检查数据校验数据非法时自动且明确的错误深层嵌套 JSON 同样适用输入转换从网络数据转为 Python 类型来源覆盖 JSON、路径参数、查询参数、Cookie、请求头、表单、文件输出转换Python 对象转 JSON 返回支持str/int/float/bool/list、datetime、UUID、数据库模型等自动交互文档内置 Swagger UI 与 ReDoc 两套界面。针对上面的代码FastAPI 具体会做校验GET/PUT路径中都存在item_id校验item_id是int否则客户端收到清晰错误检查GET是否有可选查询参数q声明为 None即为可选去掉None则变为必填如PUT的 Body对PUT /items/{item_id}读取 JSON Body必填name: str、必填price: float、可选is_offer: bool存在时必须是布尔且深层嵌套对象同样生效自动完成 JSON 双向转换用 OpenAPI 完整记录这一切可供交互式文档与多语言客户端代码自动生成工具消费直接提供两套交互文档 Web 界面。最后首页给了一个体验类型提示价值的小实验把return {item_name: item.name, ...}中的item.name改成item.price编辑器会自动补全Item的属性并知道其类型——这正是标准 Python Pydantic带来 IDE 集成的直观体现。仓库中的截图 docs/en/docs/img/vscode-completion.png 对应的就是该补全效果。完整功能教程见文档站的 Tutorial仓库中docs_src/下 90 余个教程示例目录与tests/test_tutorial/下的 325 个测试文件一一对应涵盖 Header/Cookie/表单/文件参数、maximum_length/regex等校验约束、依赖注入、OAuth2/JWT/HTTP Basic 安全、嵌套 JSON 模型、GraphQL 集成以及 Starlette 带来的 WebSockets、基于 httpx 与 pytest 的简单测试、CORS、Cookie 会话等。部署fastapi deploy与任意云首页将部署标记为可选步骤$ uv run fastapi deploy输出示例Deploying to FastAPI Cloud... ✅ Deployment successful! Ready the chicken! Your app is ready at https://myapp.fastapicloud.devCLI 会自动识别 FastAPI 应用并部署到 FastAPI Cloud未登录时会打开浏览器完成认证。FastAPI Cloud 由 FastAPI 作者与团队开发面向创建、部署、访问 API的最小化流程并是 FastAPI 系列开源项目的主要资助方。文档同时强调FastAPI 是开源且基于标准的任何云厂商都可以部署——遵循对应云厂商的部署指南即可生产环境建议配合fastapi run与uvicorn[standard]的高性能组件。性能TechEmpower 基准的位置首页Performanz一节的结论独立 TechEmpower 基准显示运行在 Uvicorn 下的 FastAPI 应用是最快的可用 Python 框架之一仅排在 Starlette 与 Uvicorn 本身之后二者即 FastAPI 内部使用的组件。该结论附带前提基于 TechEmpower 的 query 测试项独立基准随时间可能变化且性能优势很大程度来自 Uvicorn uvicorn[standard]含uvloop等的运行栈选择。更完整的基准讨论见文档站 Benchmarks 章节。依赖关系总览与许可证综合首页与 pyproject.toml核心依赖starlette0.46.0、pydantic2.9.0、typing-extensions4.8.0、typing-inspection0.4.2、annotated-doc0.0.2standard组fastapi-cli[standard]、fastar、httpx、jinja2、python-multipart、email-validator、uvicorn[standard]、pydantic-settings、pydantic-extra-types变体standard-no-fastapi-cloud-cli去云 CLI、all再加itsdangerous、pyyaml额外可选orjson使用ORJSONResponse时需要、ujson使用UJSONResponse时需要——首页单列了这一节fastapi/responses.py 中确有对应的响应类实现。项目基于MIT 许可证发布见 LICENSE 与 pyproject.toml 的license MIT声明。小结这篇官方首页文档勾勒出的 FastAPI 工作流可以浓缩为一条主线用uv add fastapi[standard]安装 → 用标准类型注解写main.py→fastapi dev热重载启动 → 浏览器验证 JSON 响应 →/docs与/redoc自动文档交互调试 → 用 Pydantic 模型扩展请求体 → 生产用fastapi run/fastapi deploy交付。仓库中fastapi/包源码applications.py继承 Starlette、cli.py的 CLI 回退逻辑、docs_src/教程源码与tests/测试用例为文档中的每个能力点都提供了可核查的实现与验证依据。【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表