FastAPI 零基础入门指南:10 分钟搭建高性能 API

在这里插入图片描述

一、为什么选择 FastAPI?

想象一下,用 Python 写 API 可以像搭积木一样简单,同时还能拥有媲美 Go 语言的性能,这个框架凭借三大核心优势迅速风靡全球:

  • 开发效率提升 3 倍:类型注解 + 自动文档,代码即文档
  • 性能碾压传统框架:异步架构 + UJSON 序列化,QPS 轻松破万
  • 零配置自动化:Swagger UI/ReDoc 文档、数据验证、依赖注入开箱即用

二、5 分钟快速上手

1. 环境准备

# 安装核心库
pip install fastapi uvicorn pydantic

2. 第一个 API

# main.py
from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def root():return {"message": "Hello World"}

3. 启动服务

uvicorn main:app --reload

4. 访问 API

打开浏览器访问 http://localhost:8000/,你会看到:
在这里插入图片描述
打开浏览器访问 http://localhost:8000/docs,你会看到交互式 API 文档:
在这里插入图片描述

三、核心功能详解

1. 路由系统

路径参数
@app.get("/items/{item_id}")
async def read_item(item_id: int):return {"item_id": item_id}
查询参数
@app.get("/users")
async def read_users(skip: int = 0, limit: int = 10):return {"users": fake_users_db[skip : skip + limit]}
响应模型
from pydantic import BaseModelclass User(BaseModel):id: intname: str@app.get("/user/{user_id}", response_model=User)
async def get_user(user_id: int):return User(id=user_id, name="Alice")

2. 数据验证

class Item(BaseModel):name: strprice: floatis_offer: bool = None@app.post("/items/")
async def create_item(item: Item):return {"item_name": item.name, "item_price": item.price}

3. 异步支持

import asyncio@app.get("/async-task")
async def async_task():await asyncio.sleep(1)  # 模拟耗时操作return {"result": "Done"}

四、生产级功能

1. 自动文档

  • Swagger UI:访问 /docs 进行交互式测试
  • ReDoc:访问 /redoc 获取简洁文档
  • OpenAPI 规范:自动生成标准接口契约

2. 依赖注入

def get_db():db = Database()try:yield dbfinally:db.close()@app.get("/items/")
async def read_items(db: Database = Depends(get_db)):return db.query("SELECT * FROM items")

3. 中间件

@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_timeresponse.headers["X-Process-Time"] = str(process_time)return response

五、进阶技巧

1. 代码结构优化

myapi/
├── main.py
├── routers/
│   ├── items.py
│   └── users.py
├── models.py
└── schemas.py

2. 性能优化

# 使用orjson加速序列化
from fastapi import FastAPI
from fastapi.responses import ORJSONResponseapp = FastAPI(default_response_class=ORJSONResponse)

3. 测试方案

from fastapi.testclient import TestClientclient = TestClient(app)def test_root():response = client.get("/")assert response.status_code == 200assert response.json() == {"message": "Hello World"}

六、生态工具链

工具类型推荐工具核心功能
代码生成fastapi-code-generator从 OpenAPI 生成项目骨架
调试工具httpie命令行 API 测试
监控Prometheus + Grafana性能指标可视化
部署Docker + Kubernetes云原生部署

七、真实案例

某电商平台使用 FastAPI 重构商品推荐接口后:

  • 日均请求量从 200 万增至 800 万
  • 响应时间中位数从 420ms 降至 110ms
  • 接口联调周期缩短 60%

八、常见问题

  1. 如何处理跨域请求?
from fastapi.middleware.cors import CORSMiddlewareapp.add_middleware(CORSMiddleware,allow_origins=["*"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)
  1. 如何自定义异常响应?
@app.exception_handler(ValueError)
async def value_error_handler(request, exc):return JSONResponse(status_code=400,content={"message": f"Invalid value: {exc}"},)

九、学习资源

  • 官方文档:https://fastapi.tiangolo.com
  • Github:https://github.com/fastapi/fastapi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】BFS-解决FloodFill问题

目录 FloodFill问题 图像渲染 岛屿数量 岛屿的最大面积 被围绕的区域 FloodFill问题 FloodFill就是洪水灌溉的意思,假设有下面的一块田地,负数代表是凹地,正数代表是凸地,数字的大小表示凹或者凸的程度。现在下一场大雨&…

代码随想录算法训练营第三十七天|动态规划part4

1049. 最后一块石头的重量 II 题目链接: 1049. 最后一块石头的重量 II - 力扣(LeetCode) 文章讲解: 代码随想录 思路: 理解为把石头分成两堆 使得两堆的差值尽可能小 求这个最小值1 理解为往背包里装物品 每个物品的…

(八)深入了解AVFoundation-采集:拍照功能的实现

引言 在上一篇文章中,我们初步完成了使用 AVFoundation 采集视频数据的流程,掌握了 AVCaptureSession 的搭建与视频流的预览显示。 本篇将继续深入 AVFoundation,聚焦于静态图片采集的实现。通过 AVCapturePhotoOutput,我们可以…

git tag使用场景和实践

背景 每次上线一个迭代,为了区分本次代码的分支是哪个迭代的commit,可以给分支打上tag,这样利于追踪分支所属迭代,如果devops没有自动给分支打tag,需要自己来打 操作 1.查看当前tag git tag2.给分支打tag git tag…

从零开始掌握Linux数据流:管道与重定向完全指南

全文目录 1 知识背景与核心概念1.1 操作系统的输入输出模型1.2 Shell 的中间人角色 2 重定向技术深度解析2.1 输出重定向2.1.1 覆盖写2.1.2 追加写2.1.3 错误重定向2.1.4 同时重定向 stdout 和 stderr 2.2 输入重定向2.2.1 文件作为输入源2.2.2 Here Document(多行输…

aws(学习笔记第三十九课) iot-core

文章目录 aws(学习笔记第三十九课) iotcore(Internet Of Thing)学习内容:1. 整体架构1.1 代码链接1.2 整体架构(概要)1.3 整体架构(详细 )2. 代码解析2.1 创建`IOT thing`2.2 创建`AWS IOT certificate`证书2.2.1 创建`lambda`需要的`role`2.2.2 创建`lambda`2.2.3 `lambd…

国家新政鼓励游戏出海,全球化安全威胁如何解

本文作者:腾讯宙斯盾DDoS防护团队 01 政策红利释放:游戏出海升级为“国家战略工程” 01 4月21日,国务院新闻办公室发布《加快推进服务业扩大开放综合试点工作方案》,释放了一个信号:首次将“游戏出海”列为战略级工程&…

MobX 在 React 中的使用:状态管理的新选择

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…

Idea 配置 Git

1、下载Git 下载地址: Git - Downloading Package 2、win 打开 git bash ,配置邮箱和用户名 //配置邮箱 git config --global user.email "710419844qq.com" //配置全局用户名 git config --global user.name "smelodys" 3、ide…

Vue3 + OpenLayers 开发教程 (四) 样式配置与性能优化

1. 地图样式基础概念 1.1 什么是地图样式? 地图样式是决定地图要素(点、线、面)如何显示的重要配置。在 OpenLayers 中,样式主要包含以下几个核心组件: Fill(填充):控制面状要素的…

【Nacos-安全与限流机制健全06 】

文章目录 Nacos安全机制介绍Nacos代码实现Nacos限流机制Nacos限流的代码实现 Nacos安全机制介绍 一、Nacos安全控制机制 Nacos 提供了多种安全控制机制,以保证服务和配置的访问安全: 身份验证 (Authentication) Nacos 支持用户身份验证来防止未授权的访…

自建开源远程协助服务RustDesk —— 筑梦之路

开源项目 # 服务端https://github.com/rustdesk/rustdesk-server.git# 客户端https://github.com/rustdesk/rustdesk.git 搭建服务端 需要使用的端口、协议 hbbs - RustDesk ID 注册服务器 hbbr - RustDesk 中继服务器默认情况下,hbbs 监听 21115(tcp) , 21…

Jmeter中同步定时器使用注意点

1.设置数量不可大于总线程数量,不然会一直等待 2.设置数量必须与总线程数量成整数倍数,不然还是要一直等。 3.当配置的数量小于线程数时,最好把循环打开,避免最后一次未准备好的线程数量达不到并发数。

作为高速通道光纤传输模式怎么理解以及到底有哪些?

光纤的传输模式主要取决于光纤的结构(如纤芯直径和折射率分布),不同模式对应光波在光纤中传播的不同路径和电磁场分布。以下是光纤传输模式的主要分类及特点: 1. 单模光纤(Single-Mode Fiber, SMF) 核心特点: 纤芯直径极小(通常为 8-10微米),仅允许光以单一模式(…

小程序Npm package entry file not found?

修改依赖包的入口文件 看是不是cjs,小程序不支持cjs

Android HAL HIDL

1 Android HAL HIDL 1.1 Android中查看有哪些HIDL HAL HIDL是Treble Interface的一部分。 adb root adb shell # lshal 1.2 Android打印C调用栈 #include <utils/CallStack.h> 在需要打印的地方加如下的定义。 android::CallStack stack("oem"); logcat | g…

【AI 加持下的 Python 编程实战 2_11】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(下)

&#xff08;接 上篇&#xff09; 5 复盘与 Copilot 的交互过程 前面两篇文章分别涵盖了扫雷游戏的问题分解和代码实现过程&#xff0c;不知道各位是否会有代码一气呵成的错觉&#xff1f;实际上&#xff0c;为了达到最终效果&#xff08;如下所示&#xff09;&#xff0c;我…

游戏状态管理:用Pygame实现场景切换与暂停功能

游戏状态管理:用Pygame实现场景切换与暂停功能 在开发游戏时,管理游戏的不同状态(如主菜单、游戏进行中、暂停等)是非常重要的。这不仅有助于提升玩家的游戏体验,还能使代码结构更加清晰。本文将通过一个简单的示例,展示如何使用Pygame库来实现游戏中的场景切换和暂停功…

Java后端开发day36--源码解析:HashMap

&#xff08;以下内容均来自上述课程&#xff09; 1. HashMap&#xff08;一&#xff09; 底层&#xff1a;数组链表红黑树 1.1 前提准备 查看源码&#xff1a;选中HashMap–ctrlB 小细节&#xff1a;快捷键ctrlf12–跳出目录结构 蓝色圆圈&#xff1a;class 证明是类名粉…

RT-Thread学习笔记(四)

RT-Thread学习笔记 线程间同步信号量信号量的使用和管理动态创建信号量静态创建信号量获取信号量信号量同步实列互斥量互斥量的使用和管理互斥量动态创建互斥量静态创建互斥量获取和释放互斥量实例事件集事件集的使用和管理动态创建事件集静态初始化事件集发送和接收事件事件集…