高性能Python Web 框架--FastAPI 学习「基础 → 进阶 → 生产级」

        以下是针对 FastAPI 的保姆级教程,包含核心概念、完整案例和关键注意事项,采用「基础 → 进阶 → 生产级」的三阶段教学法:

一、FastAPI介绍

        FastAPI 是一个现代化的、高性能的 Python Web 框架,专门用于构建 APIs(应用程序编程接口)。以下是它的核心特性和定位:

FastAPI 的本质

  1. 类型优先的框架:基于 Python 类型提示(Type Hints)

  2. 异步支持:原生兼容 async/await 语法

  3. 自动文档生成:内置 OpenAPI(Swagger)和 JSON Schema 支持

  4. 高性能:媲美 NodeJS 和 Go 的速度(Starlette 底层)

优势

FastAPI 核心优势

  1. 性能卓越:基于 Starlette(异步)和 Pydantic(类型校验)

  2. 开发效率:自动生成 Swagger/Redoc 文档

  3. 类型安全:Python 类型注解驱动

  4. 异步支持:原生 async/await 支持

对比

特性FastAPIFlaskDjango
异步支持✅ 原生❌ 需扩展❌ 需扩展
自动 API 文档✅ 内置❌ 需扩展❌ 需扩展
开发速度⚡️ 极快🏎️ 快🐢 中等
学习曲线📈 中等📉 低📈 高
性能🚀 最高🏎️ 中等🚗 中等

核心组件架构 

典型应用场景

  1. 微服务架构:轻量级 API 服务

  2. 数据科学接口:机器学习模型部署

  3. 实时应用:WebSocket 支持

  4. 快速原型开发:即时 API 文档


二、环境准备

# 创建虚拟环境(Python≥3.8)
python -m venv venv
source venv/bin/activate  # Linux/Mac
venv\Scripts\activate    # Windows# 安装依赖
pip install "fastapi[all]" uvicorn

三、基础案例:用户管理系统

1. 项目结构

user_api/
├── main.py          # 主应用
├── models.py        # Pydantic 模型
└── database.py      # 模拟数据库

2. 模型定义 (models.py)

from pydantic import BaseModel, EmailStrclass UserBase(BaseModel):email: EmailStrclass UserCreate(UserBase):password: strclass User(UserBase):id: intis_active: boolclass Config:from_attributes = True  # 替换原来的 orm_mode

3. 数据库模拟 (database.py)

from typing import Dict
fake_db: Dict[int, User] = {}class UserCRUD:@staticmethoddef create(user: UserCreate) -> User:user_id = len(fake_db) + 1db_user = User(id=user_id, email=user.email, is_active=True)fake_db[user_id] = db_userreturn db_user

4. 主应用 (main.py)

from fastapi import FastAPI, HTTPException
from models import User, UserCreate
from database import UserCRUDapp = FastAPI()@app.post("/users/", response_model=User)
async def create_user(user: UserCreate):return UserCRUD.create(user)@app.get("/users/{user_id}", response_model=User)
async def read_user(user_id: int):if user_id not in fake_db:raise HTTPException(status_code=404, detail="User not found")return fake_db[user_id]

5. 启动与测试 

uvicorn main:app --reload
  • 访问 http://127.0.0.1:8000/docs 查看交互文档

  • 测试请求:

    curl -X POST "http://127.0.0.1:8000/users/" \
    -H "Content-Type: application/json" \
    -d '{"email":"user@example.com","password":"secret"}'
  • 注意:若项目结构非上述结构,启动需进入到对应文件目录执行。如图:

    四、进阶功能

    1. 依赖注入

    from fastapi import Dependsdef get_db():db = fake_db  # 模拟数据库连接try:yield dbfinally:pass  # 实际场景关闭连接@app.get("/items/")
    async def read_items(db: dict = Depends(get_db)):return db

    2. 异步数据库

    from sqlalchemy.ext.asyncio import AsyncSession@app.post("/async-users/")
    async def create_async_user(user: UserCreate, db: AsyncSession = Depends(get_async_db)
    ):# 使用 asyncpg 或 aiomysql 等pass

    3. 中间件

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

    五、生产级注意事项

    1. 安全加固

    from fastapi.security import OAuth2PasswordBeareroauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")@app.get("/secure/")
    async def secure_endpoint(token: str = Depends(oauth2_scheme)):return {"token": token}

    2. 配置管理

    from pydantic_settings import BaseSettingsclass Settings(BaseSettings):app_name: str = "User API"admin_email: stritems_per_page: int = 50class Config:env_file = ".env"

    3. 日志监控

    import logging
    from fastapi.logger import loggerlogging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    )
    logger = logging.getLogger(__name__)

    六、性能优化技巧

  • 路由注册顺序:高频路由放前面

  • 响应模型优化

    @app.get("/users/", response_model=List[User])
    async def read_users(limit: int = 100):  # 分页限制return list(fake_db.values())[:limit]
  • 静态文件缓存

    from fastapi.staticfiles import StaticFiles
    app.mount("/static", StaticFiles(directory="static"), name="static")

    七、常见错误解决方案

    错误类型解决方法
    422 Validation Error检查请求体是否符合 Pydantic 模型
    ImportError: cannot import name 'UploadFile'升级 fastapi 版本
    异步函数忘记加 await使用 @router.get() 替代 @app.get() 时需注意

    八、完整项目示例

    推荐学习官方示例库:

    git clone https://github.com/tiangolo/fastapi-examples

    通过这个教程,您已经掌握了从开发到部署 FastAPI 的全流程。建议下一步:

  • 集成 Redis 缓存

  • 学习 APIFlask 比较异同

  • 研究 OpenAPI 扩展规范

九、学习路径建议

  1. 初级阶段:掌握路由、Pydantic 模型

  2. 中级阶段:依赖注入、中间件

  3. 高级阶段:自定义 APIRoute、背景任务

  4. 专家阶段:ASGI 生命周期钩子、测试策略

FastAPI 的官方文档(https://fastapi.tiangolo.com)提供了最权威的指南,推荐结合实践项目逐步深入。对于已有 Flask/Django 经验的开发者,通常可在 2-3 天内完成转型。

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

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

相关文章

H2 Database Select 语句执行流程

H2 Database Select 语句执行流程 使用 // CREATE TABLE IF NOT EXISTS test(id INT primary key, name VARCHAR(255)) // insert into test(id, name) values(1, name1), (2, name2), (3, name3), (4, name4); String sql "SELECT * FROM test where id > 1 and na…

理解 Envoy 的架构

理解 Envoy 的架构对于深入理解 Istio 至关重要,因为 Envoy 是 Istio 数据平面的核心。Envoy 是一个高性能的 C 分布式代理,设计为云原生应用和大规模微服务架构的网络基础。 以下是 Envoy 架构的关键组成部分和核心理念: 核心设计理念&…

Android开发-常用布局

在Android应用开发中,布局决定了用户界面的结构和元素之间的相对位置。选择合适的布局不仅能够提升用户体验,还能提高代码的可维护性和灵活性。本文将介绍几种最常用的Android布局方式,包括LinearLayout、RelativeLayout、ConstraintLayout以…

如何在MySQL中实现类似Redis的PING命令的功能来检测连接状态?

要在MySQL中实现类似Redis的PING命令的功能来检测连接状态,可以采用以下方法: 方法一:使用简单的SQL查询 最直接的方法是通过执行一个简单的查询来检测连接状态,例如: SELECT 1;如果查询成功并返回结果(…

Vue 系列之:defineProps、defineEmits、...

defineProps 用于接收父组件传递的属性值。 父组件&#xff1a; <!-- 父组件 --> <template><Child1 str"字符串" :num"num" />-----------------<Child2 str"字符串" :num"num" /> </template><…

windows服务器部署Gitlab

代码托管,如果对工具功能要求不高,Gitea也可以满足需要,只是功能相对比较简单。 通常GltLab是部署在linux服务器上的,windows版本已经不维护了。不过现在windows10 11已经可以实现部署了,一个是windows本机部署linux虚拟机(windows商店直接安装或者其他虚拟机平台都可以)…

剖析 FFmpeg:从基本功能到过滤器,实现音视频处理的灵活性

目录 1.解复用2 解码2.1 音频解码2.2 视频解码 3 修饰3.1 avio3.2 重采样 4 过滤器4.1 过滤器基本知识4.2 简单过滤器4.3 复杂滤镜图 1.解复用 解复用就是把容器中的媒体流分离出来&#xff0c;方便我们对媒体流处理。 step1&#xff1a;对媒体文件上下文初始化 AVFormatCont…

kafka学习笔记(四、生产者、消费者(客户端)深入研究(三)——事务详解及代码实例)

1.事务简介 Kafka事务是Apache Kafka在流处理场景中实现Exactly-Once语义的核心机制。它允许生产者在跨多个分区和主题的操作中&#xff0c;以原子性&#xff08;Atomicity&#xff09;的方式提交或回滚消息&#xff0c;确保数据处理的最终一致性。例如&#xff0c;在流处理中…

Missashe计网复习笔记(随时更新)

Missashe计算机网络复习笔记 前言&#xff1a;这篇笔记用于博主对计网这门课所学进行记录和总结&#xff0c;也包括一些个人的理解。正在更新当中…… 第一章 计算机网络体系结构 考纲内容 (一) 计算机网络概述 计算机网络的概念、组成与功能;计算机网络的分类; 计算机网络…

PVP鼠标推荐(deepseek)

下面有不懂的自行百度查找&#x1f44d; ❤️ 以下是几款在 双击性能&#xff08;DBC&#xff09; 和 拖拽点击&#xff08;DC&#xff09; 方面表现优秀的游戏鼠标推荐&#xff0c;结合了硬件性能、微动寿命以及玩家口碑&#xff1a; 1. 罗技 G102/G203 Lightsync 特点&#…

ABP vNext + EF Core 实战性能调优指南

ABP vNext EF Core 实战性能调优指南 &#x1f680; 目标 本文面向中大型 ABP vNext 项目&#xff0c;围绕查询性能、事务隔离、批量操作、缓存与诊断&#xff0c;系统性地给出优化策略和最佳实践&#xff0c;帮助读者快速定位性能瓶颈并落地改进。 &#x1f4d1; 目录 ABP vN…

为啥大模型一般将kv进行缓存,而q不需要

1. 自回归生成的特点 大模型&#xff08;如 GPT 等&#xff09;在推理时通常采用自回归生成的方式&#xff1a; 模型逐个生成 token&#xff0c;每次生成一个新 token 时&#xff0c;需要重新计算注意力。在生成第 t 个 token 时&#xff0c;模型需要基于前 t-1 个已生成的 t…

3DGS-slam:splatam公式

配套讲解视频&#xff1a;https://www.bilibili.com/video/BV1ZgfBYdEpg/?spm_id_from333.1387.homepage.video_card.click&vd_sourced4c3e747c32049ddd90dcce17208f4e0 1、多维高斯分布公式: 对于多维&#xff08;多变量&#xff09;高斯分布&#xff0c;概率密度函数的…

从Dockerfile 构建docker镜像——保姆级教程

从Dockfile开始 dockerfile简介开始构建1、编辑dockerfile2、构建镜像3、拉取镜像4、推送到镜像仓库 镜像的优化1、优化的基本原则2、多阶段构建 dockerfile简介 开始构建 1、编辑dockerfile # 使用官方的 Python 3.8 镜像作为基础镜像 FROM python:3.8-slim# 设置工作目录 …

开元类双端互动组件部署实战全流程教程(第2部分:控制端协议拆解与机器人逻辑调试)

作者&#xff1a;那个写了个机器人结果自己被踢出房间的开发者 游戏逻辑房间结构参考界面 从这张图我们能看出&#xff0c;该组件按功能结构细分为多个房间&#xff0c;每个房间底注、准入标准不同&#xff0c;对应的控制模块也有层级区分。常规来说&#xff0c;一个“互动房间…

[特征工程]机器学习-part2

1 特征工程概念 特征工程:就是对特征进行相关的处理 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。 特征工程步骤…

[数据库之十一] 数据库索引之联合索引

执行数据库查询时&#xff0c;通常查询条件是多对个属性进行判断和约束&#xff0c;对于这种类型的查询&#xff0c;如果存在多个索引则使用多个索引&#xff0c;或者使用建立在多属性搜索码上的索引&#xff0c;这样能提高查询效率。 一、使用多个单码索引 假设数据表 instruc…

增强学习(Reinforcement Learning)简介

增强学习&#xff08;Reinforcement Learning&#xff09;简介 增强学习是机器学习的一种范式&#xff0c;其核心目标是让智能体&#xff08;Agent&#xff09;通过与环境的交互&#xff0c;基于试错机制和延迟奖励反馈&#xff0c;学习如何选择最优动作以最大化长期累积回报。…

PaddlePaddle 和PyTorch选择与对比互斥

你遇到的错误信息如下&#xff1a; RuntimeError: (PreconditionNotMet) Tensors dimension is out of bound.Tensors dimension must be equal or less than the size of its memory.But received Tensors dimension is 8, memorys size is 0.[Hint: Expected numel() * Size…

vison transformer vit 论文阅读

An Image is Worth 16x16 Words 20年的论文看成10年的哈斯我了 [2010.11929] 一张图像胜过 16x16 个单词&#xff1a;用于大规模图像识别的转换器 --- [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 为什么transformer好训练&am…