Fastapi框架总览与核心架构

Fastapi框架总览与核心架构

FastAPI 是一个基于 Python 的现代 Web 框架,专注于 高性能、高并发 和 开发效率,特别适合构建 异步 API 服务、微服务接口,同时在大模型接口封装中也广泛应用。它基于 Starlette(异步 Web 框架) 和 Pydantic(数据验证模型)构建,拥有非常清晰的架构层次和组件机制。

FastAPI 与其它框架的对比

框架类型校验异步支持文档生成性能
Flask⚠️ 部分支持中等
Django⚠️ 基本支持中等偏低
FastAPI✅ 完整支持✅ 完整支持✅ 自动化非常优秀
Sanic优秀
Tornado

✅ 什么是“路由”?
🚏 路由定义:
“路由”就是 URL 到处理函数的映射。

在 Web 框架中,用户访问 /users/123,系统就需要知道该调用哪个函数来处理这个请求,这个“地址 → 函数”的映射关系就是路由。

🚧 路由定义包括三个部分:

含义举例
URL 路由请求的路径(path)/users/{user_id}/login
请求方法HTTP 动作类型GET, POST, PUT, DELETE
请求参数规范参数类型与位置路径参数、查询参数、请求体、表单、文件

📌 什么是 HTTP 动作类型?
HTTP 是浏览器和服务器通信的协议,它有几种“动作”方式(也叫“方法”)来表示客户端希望干什么。

方法含义举例
GET获取资源浏览页面、获取数据 /items/1
POST创建资源提交表单、新建数据 /login
PUT修改整个资源替换资源 /users/1
PATCH修改部分资源改昵称 /users/1/name
DELETE删除资源删除用户 /users/1

✅ 什么是参数类型与位置?路径参数、查询参数、请求体、表单、文件 是什么意思?

📌 在 FastAPI 中,参数可以来自不同位置:

参数类型来源示例路径/形式FastAPI 接收方式
路径参数URL 本身/items/123item_id=123函数参数
查询参数URL 的 ?key=val/search?q=apple函数参数
请求体(JSON)POST/PUT 里的 body{"name": "apple", "price": 1.2}Pydantic 模型
表单参数HTML form 提交form 表单中的字段Form(...)
文件上传上传图片/文件文件作为 body 的部分File(...)

✅ Pydantic 是什么?
Pydantic 是一个数据验证框架,用于定义和校验模型结构。

from pydantic import BaseModelclass User(BaseModel):username: strage: intu = User(username="hao", age="20")  # 会自动转成 int

在 FastAPI 中用于:
校验请求体
响应结构
自动生成文档

一、FastAPI 框架核心特性总览

特性说明
类型注解驱动开发使用 Python 3.6+ 的类型提示,自动生成文档、校验入参
自动生成 OpenAPI 文档自动提供 Swagger UI 和 Redoc 文档接口
基于 Starlette 异步内核支持高性能的异步调用(WebSocket、Streaming 等)
依赖注入机制具备轻量级的依赖注入系统,适合模块化扩展
请求数据自动校验使用 Pydantic 模型校验入参,异常处理机制优雅
支持 OAuth2/JWT 等认证方便集成现代安全机制(OAuth2、JWT、Bearer Token 等)
极高性能性能可媲美 NodeJS / Go,比 Flask 和 Django 快数倍

1️⃣ 类型注解驱动开发(Type Hints = Contract + Logic)

✅ 描述
FastAPI 利用了 Python 3.6+ 的类型注解(Type Hints),不仅仅用于代码提示,更直接决定了入参校验、自动文档、序列化格式等。

✅ 示例

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):return {"item_id": item_id, "query": q}

✅ 效果
item_id: int → FastAPI 自动将 URL 参数转为 int,非 int 会报 422 Unprocessable Entity

q: str = None → 这是一个可选的 query 参数,自动解析 query string

自动生成 OpenAPI 文档,支持前端自动调试

2️⃣ 自动生成交互式 API 文档(OpenAPI + Swagger)

✅ 描述
FastAPI 内置支持生成:

/docs → 使用 Swagger UI

/redoc → 使用 ReDoc

/openapi.json → 原始 JSON 格式的 OpenAPI 规范

✅ 优点
前后端联调更高效

自动生成参数示例、响应格式、错误码定义

可以直接在线调用和测试接口

3️⃣ Pydantic 数据模型(Request 校验 & Response 构造)
✅ 描述
FastAPI 使用 Pydantic 作为请求体和响应体的数据校验与构造工具,拥有极强的类型支持、嵌套能力和默认值机制。
✅ 示例

from pydantic import BaseModelclass Item(BaseModel):name: strprice: floatis_offer: bool = False
@app.post("/items/")
def create_item(item: Item):return item

✅ 功能
自动将 JSON 请求体解析为 Python 对象

参数不合法时自动返回 422 错误 + 错误详情

同时可作为响应结构文档

4️⃣ 异步支持(基于 Starlette 的 async/await)
✅ 描述
FastAPI 完全基于 Starlette 的异步内核,原生支持异步视图函数和并发调用。

✅ 示例

import httpx@app.get("/async_request")
async def async_request():async with httpx.AsyncClient() as client:r = await client.get("https://example.com")return {"status": r.status_code}

✅ 优点
支持大规模并发(如多模型同时调用)

不阻塞主线程,适合 IO 密集型任务(数据库、网络请求等)

5️⃣ 依赖注入机制(Dependency Injection)
✅ 描述
通过 Depends(…) 提供函数或对象的依赖注入,FastAPI 自动解析依赖调用关系。
✅ 示例

from fastapi import Dependsdef get_db():db = connect_to_db()try:yield dbfinally:db.close()@app.get("/users/")
def get_users(db = Depends(get_db)):return db.query("SELECT * FROM users")

✅ 优点
把常用逻辑(数据库连接、鉴权、安全校验)封装成可复用模块

可缓存、可作用域控制、支持异步

二、FastAPI 核心架构分层

┌────────────────────────────┐
│ 1. 接口层(API Router) │ ← 请求入口,定义路由
├────────────────────────────┤
│ 2. 控制器层(View/Controller)│ ← 调用服务逻辑 + 响应格式
├────────────────────────────┤
│ 3. 服务层(Service Layer) │ ← 编排业务逻辑/异步任务/模型调用
├────────────────────────────┤
│ 4. 数据访问层(Repository) │ ← 访问数据库/外部接口
├────────────────────────────┤
│ 5. 模型层(Schema/Model) │ ← Pydantic 模型 / ORM 模型
├────────────────────────────┤
│ 6. 框架层(Middleware/Startup)│ ← 中间件 / 生命周期 / DI 注入
└────────────────────────────┘

1️⃣ 接口层(Router Layer)

作用:定义 URL 路由、请求方法、请求参数规范
实现方式:使用 APIRouter 或直接在 FastAPI() 实例中注册路由

from fastapi import APIRouter
router = APIRouter()@router.get("/users/{user_id}")
def get_user(user_id: int):...

特点:

类型注解决定参数类型、是否必填

自动生成文档

路由模块可拆分,适合模块化开发(如 /users/、/items/)

2️⃣ 控制器层(Controller/View Layer)

作用:处理请求流程控制,组织调用服务层,并定义返回模型
实现方式:通常和路由函数合并,或封装为类/函数依赖项

@router.post("/login", response_model=Token)
def login(user: LoginForm, service: AuthService = Depends()):return service.authenticate(user)

特点:

包含参数校验、服务调用、响应封装

可做基本异常捕捉、权限判断

可封装为类结构,实现面向对象风格控制器

3️⃣ 服务层(Service Layer / UseCase)

作用:编排业务逻辑,组织多个数据源调用,支持异步任务
实现方式:写为类或独立函数,通过依赖注入使用

class AuthService:def __init__(self, user_repo: UserRepo = Depends()):self.user_repo = user_repodef authenticate(self, login_data: LoginForm) -> Token:user = self.user_repo.find_by_username(login_data.username)...

4️⃣ 数据访问层(Repository / DAO)

作用:封装对数据库、缓存、第三方 API 的访问逻辑
实现方式:使用 ORM(如 SQLAlchemy)、ODM 或直接 SQL 封装

class UserRepo:def __init__(self, db: Session = Depends(get_db)):self.db = dbdef find_by_username(self, username: str):return self.db.query(User).filter(User.username == username).first()

好处:

逻辑复用

屏蔽数据源实现差异

支持单元测试 Mock

5️⃣ 模型层(Pydantic Schema + ORM Model)

5.1 ✅ 请求/响应模型(Pydantic)

class UserIn(BaseModel):username: strpassword: strclass UserOut(BaseModel):id: intusername: str

途:

入参校验

返回结果标准化

文档自动生成
5.2 ✅ 数据库模型(SQLAlchemy/ORM)

class User(Base):__tablename__ = "users"id = Column(Integer, primary_key=True)username = Column(String)password_hash = Column(String)

6️⃣ 框架层(Middleware / Startup / Dependency)

作用:

实现跨请求逻辑(如日志、权限、限流)

注册应用级资源(连接池、缓存、队列)

提供依赖注入机制

✅ 中间件示例:

@app.middleware("http")
async def add_log(request: Request, call_next):response = await call_next(request)response.headers["X-Service"] = "fastapi"return response

✅ 启动事件:

@app.on_event("startup")
def init():global redis_poolredis_pool = init_redis_pool()

✅ 依赖注入定义:

def get_settings():return Settings()@app.get("/config")
def read_config(settings: Settings = Depends(get_settings)):return settings

🔁 各层之间的调用关系
前端请求 → Router → Controller → Service → Repository → DB/API

Pydantic Schema

响应模型 → 自动文档

🔔 客户端发出请求(URL + Headers + Body)

🔍 FastAPI 解析 HTTP 方法 + URL 模式

📦 匹配对应函数 + 分析函数签名

📥 解析参数来源(路径 / 查询 / 请求体 / 表单 / 文件)

✅ 自动类型转换(str → int 等)+ Pydantic 校验

🚀 执行函数逻辑,返回 JSON 响应

三、核心模块拆解与职责

模块/层主要职责FastAPI 实现方式
1️⃣ 路由注册定义请求路径、HTTP 方法、绑定处理函数@app.get/post(...)APIRouter
2️⃣ 视图函数处理参数解析、调用业务逻辑、构造响应普通 def/async def 函数
3️⃣ 数据模型请求体/响应体结构定义、类型校验、文档生成Pydantic 模型
4️⃣ 依赖注入注入共享资源(数据库连接、配置、认证信息等)Depends(...)
5️⃣ 异步执行非阻塞调用 IO(如数据库、HTTP 请求、模型推理)async def + await + Uvicorn
6️⃣ 中间件与事件拦截请求/响应,全局处理逻辑,应用启动/关闭初始化清理@app.middleware(...), @app.on_event(...)

1️⃣ 路由注册模块(Routing System)

✅ 作用:
将 HTTP 方法 + URL 路径映射到某个 Python 函数上(即路由处理函数)
✅ 典型写法:

from fastapi import FastAPIapp = FastAPI()@app.get("/users/{user_id}")
def get_user(user_id: int):return {"user_id": user_id}

📌 特点:
自动绑定参数(路径参数、查询参数、Body 参数)

自动纳入 OpenAPI 文档

可模块化拆分,适合大型项目管理

2️⃣ 视图函数模块(View / Controller)

✅ 作用:
接收客户端请求参数(由 FastAPI 自动注入)

调用服务逻辑

构造标准化响应

@app.get("/items/")
def read_items(skip: int = 0, limit: int = 10):items = db.query(Item).offset(skip).limit(limit).all()return items

📌 特点:
通常放在 controller 或 api/ 中

可组合依赖项(如认证信息、数据库连接)

返回的数据会被自动 JSON 序列化

3️⃣ 数据模型模块(Pydantic Model)

✅ 作用:
定义请求/响应结构

类型强校验 + 默认值管理

自动生成 API 文档说明

from pydantic import BaseModelclass UserIn(BaseModel):username: strpassword: strclass UserOut(BaseModel):id: intusername: str

📌 用法:
函数参数用作请求体接收(POST / PUT)

返回值用作响应模型

@app.post("/users/", response_model=UserOut)
def create_user(user: UserIn):...return UserOut(id=1, username=user.username)

4️⃣ 依赖注入模块(Dependency Injection)

✅ 作用:
将一些“重复调用或需要共享状态”的组件,如数据库、配置、认证信息,通过 Depends 注入进来

from fastapi import Dependsdef get_db():db = SessionLocal()try:yield dbfinally:db.close()@app.get("/users/")
def list_users(db=Depends(get_db)):return db.query(User).all()

📌 应用场景:
数据库连接

鉴权与用户信息注入

公共服务类(如缓存服务、Token 解析器)

5️⃣ 异步执行模块(Async Runtime)

✅ 作用:
高性能并发处理,如:

并发处理多个 HTTP 请求

非阻塞 IO(数据库/模型调用)

后台任务、事件流处理

@app.get("/news/")
async def fetch_news():async with httpx.AsyncClient() as client:resp = await client.get("https://newsapi.org/...")return resp.json()

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

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

相关文章

高并发四种IO模型的底层原理

高并发四种IO模型的底层原理 1 IO读写的基本原理 为了避免用户进程直接操作内核,保证内核安全,操作系统将内存(虚拟内存)划分为两部分:一部分是内核空间(Kernel-Space),另一部分是用户空间(User-Space)。在…

腾讯云短信实战:Spring Boot接入YML配置与签名/模板/发送/统计/状态/号码包工具类详解

下面是一个Spring Boot集成腾讯云短信服务的详细示例&#xff0c;包含配置和6个工具类&#xff08;签名、模板、发送、统计、状态&#xff09;&#xff0c;采用YML配置&#xff1a; 1. 添加Maven依赖 <dependency><groupId>com.tencentcloudapi</groupId>&…

【Java篇】IntelliJ IDEA 安装与基础配置指南

序 本篇文章将介绍IDEA 2023 版本。 提高开发人员的生产力。无论您是刚开始接触编程的新手&#xff0c;还是经验丰富的开发专家。 一&#xff1a;官网下载安装包&#xff1a; IDEA下载链接 这个版本可以根据自己的需要选择。 二、安装方法 双击进这个.exe文件 这里要选择合…

2-Nodejs运行JS代码

2-Nodejs运行JS代码 创建一个 js 文件编写 JS 代码 要注意的是&#xff0c;在nodejs环境中不能操作浏览器 DOM 对象相关的api&#xff0c;在Nodejs 中运行 JS 代码 按住 shift 键&#xff0c;在 js 文件所在文件夹空白处右键&#xff0c;选择 Powershell 窗口执行如下命令&…

vue中使用西瓜播放器xgplayer (封装)+xgplayer-hls 播放.m3u8格式视频

1.西瓜播放器官网 http://h5player.bytedance.com/guide/2.安装 # 最新稳定版 $ npm install xgplayer对于已有项目也可以通过 CDN 引入&#xff0c;代码如下&#xff1a; <script src"//unpkg.byted-static.com/xgplayer/2.31.2/browser/index.js" type"tex…

2025-07-15通过边缘线检测图像里的主体有没有出血

本节观点&#xff1a;一个好的提问就已经解决了问题的90%。 对于问题的描述正确与否决定了解决问题的方法和路径&#xff0c;所以我们在AI时代必须要学会正确的描述问题和表达问题&#xff0c;否则即使有AI辅助也是很难精准的解决问题。 我的问题&#xff1a; 如何利用代码从图…

【Docker基础】Dockerfile指令速览:文件与目录操作指令详解

目录 引言 1 ADD&#xff1a;高级文件复制与解压 1.1 指令简介 1.2 语法 1.3 功能详解 1.4 使用场景 1.5 执行流程 1.6 示例 1.7 注意事项 2 WORKDIR&#xff1a;设置工作目录 2.1 指令简介 2.2 语法 2.3 使用场景 2.4 创建流程 2.5 示例 2.6 注意事项 3 VOLU…

Python 程序设计讲义(2):Python 概述

Python 程序设计讲义&#xff08;2&#xff09;&#xff1a;Python 概述 一、Python 语言的发展史 Python 语言诞生于 1990 年。 2002 年 10 月&#xff0c;Python2.0 正式发布。 2008 年 12 月&#xff0c;Python3.0 正式发布。 Python3.0 在语法层面和解释器内部做了很多重大…

多租户SaaS系统中设计安全便捷的跨租户流程共享

四维协同架构​​,结合动态授权、加密传输、行为审计和智能策略 一、​​权限控制体系​​ 1. ​​动态权限模型​ ​ 2. ​​授权策略实现​​ ​​RBAC+ABAC混合模型​​ 在流程表增加shared_tenants字段存储授权信息,结合属性动态校验: CREATE TABLE workflow_process…

Spring Ioc Bean 到底是什么

Bean 到底是什么&#xff1f; 简单来说&#xff0c;Spring Bean 就是一个由 Spring IoC 容器负责创建、管理和装配的 Java 对象。 它不是一种新的技术&#xff0c;它本质上还是一个普普通通的 Java 对象&#xff08;POJO - Plain Old Java Object&#xff09;&#xff0c;但它的…

【PCIe 总线及设备入门学习专栏 5.1.1 -- PCIe PERST# 信号的作用】

文章目录 PCIe PERSTN#PERST# 信号作用概述简要定义PERST# 的关键功能PERST# 的时序图示意Synopsys PCIe EP IP 中 PERST# 的作用关键信号接口典型复位流程示例代码(Verilog for Synopsys PCIe)PERST# 使用场景举例(Synopsys PCIe EP)1. 系统上电初始化2. 热复位特定设备3.…

使用python的pillow模块将图片转化为灰度图,获取值和修改值

使用python的pillow模块可以将图片转化为灰度图&#xff0c; 可以获取灰度图的特定点值&#xff0c;区域值&#xff0c; 修改值并保存到图片 图片转换为灰度图 from PIL import Image# 打开图片 image Image.open("d://python//2//1.jpg")gray_image image.convert…

记忆力训练day41

通常是一个地点记2组词 数字和人体记忆宫殿更注重 即时性&#xff1b;地点记忆宫殿是长久性

自动微分模块

一.前言本章节我们是要学习梯队计算&#xff0c;⾃动微分&#xff08;Autograd&#xff09;模块对张量做了进⼀步的封装&#xff0c;具有⾃动求导功能。⾃动微分模块是构成神经⽹络 训练的必要模块&#xff0c;在神经⽹络的反向传播过程中&#xff0c;Autograd 模块基于正向计算…

深度学习·目标检测和语义分割基础

边缘框 不是标准的x&#xff0c;y坐标轴。边缘框三种表示&#xff1a;左上右下下坐标&#xff0c;左上坐标长宽&#xff0c;中心坐标长宽 COCO 目标检测数据集的格式&#xff1a;注意一个图片有多个物体&#xff0c;使用csv或者文件夹结构的格式不可取。 锚框算法 生成很多…

ffmpeg音视频处理大纲

FFmpeg 是一个功能强大的开源音视频处理工具集&#xff0c;其核心代码以 C 语言实现。下面从源码角度分析 FFmpeg 如何实现转码、压缩、提取、截取、拼接、合并和录屏等功能&#xff1a; 一、FFmpeg 核心架构与数据结构 FFmpeg 的源码结构围绕以下核心组件展开&#xff1a; lib…

网络安全小练习

一、docker搭建 1.安装 2.改变镜像源&#xff08;推荐国内镜像源&#xff1a;阿里云镜像源&#xff09; 登录阿里云容器镜像源服务&#xff08; 阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 &#xff09; 复制系统分配的专属地址 配置 sudo mkdir …

数据结构——顺序表的相关操作

一、顺序表基础认知​1.顺序表的定义与特点​顺序表是数据结构中一种线性存储结构&#xff0c;它将数据元素按照逻辑顺序依次存储在一片连续的物理内存空间中。简单来说&#xff0c;就是用一段地址连续的存储单元依次存放线性表的元素&#xff0c;且元素之间的逻辑关系通过物理…

2025最新国产用例管理工具评测:Gitee Test、禅道、蓝凌测试、TestOps 哪家更懂研发协同?

在快节奏的 DevOps 时代&#xff0c;测试用例管理已不再是 QA 的独角戏&#xff0c;而是穿透需求—开发—测试—交付全流程的核心枢纽。想象一下&#xff0c;如果用例结构混乱&#xff0c;覆盖不全&#xff0c;甚至丢失版本变更历史&#xff0c;不仅协作乱&#xff0c;还影响交…

在线评测系统开发交流

https://space.bilibili.com/700332132?spm_id_from333.788.0.0 实验内容爬虫Web系统设计数据分析实验指导爬虫Web系统设计自然语言处理与信息检索数据可视化评分标准FAQ实验二&#xff1a;在线评测系统实验概述实验内容Step1&#xff1a;题目管理Step2&#xff1a;题目评测S…