Python从入门到精通1:FastAPI

news2025/3/13 2:24:15

引言

在现代 Web 开发中,API 是前后端分离架构的核心。FastAPI 凭借其高性能、简洁的语法和自动文档生成功能,成为 Python 开发者的首选框架。本文将从零开始,详细讲解 FastAPI 的核心概念、安装配置、路由设计、请求处理以及实际应用案例,助你快速掌握这一高效工具。

一、FastAPI 概述与安装

1.1 什么是 FastAPI?

FastAPI 是一个基于 Python 3.8+ 的现代 Web 框架,专注于构建高性能 RESTful API。其核心特点包括:

  • 基于 Starlette 和 Pydantic:提供异步支持和严格的数据验证。
  • 自动生成 API 文档:内置 Swagger UI 和 ReDoc,开发者无需手动维护文档。
  • 类型提示(Type Hints):利用 Python 的类型系统实现输入参数验证和代码提示。

1.2 FastAPI 的优势

特性说明
高性能异步处理能力(ASGI)支持高并发,性能媲美 Node.js 和 Go。
开发效率高通过类型提示和自动文档生成,减少代码冗余和调试时间。
生态完善可无缝集成 SQLAlchemy、OAuth2、JWT 等常用库。

1.3 安装与环境配置及第一个FastApi应用

1.3.1、安装与环境配置

步骤 1:安装依赖库
pip install fastapi # FastAPI 依赖 Python 3.8 及更⾼版本
步骤 1:安装uvicorn服务器
pip install "uvicorn[standard]"  # 安装 ASGI 服务器

 

1.3.2、第一个FastApi应用

创建 test_one.py:

from fastapi import FastAPI # 导⼊FastAPI,⽤于定义API

app = FastAPI() # 创建FastAPI实例

# http请求方式类型:get、post、put、update、delete
# 浏览器默认访问的是get类型,如果使用其他形式访问
# 出现405的提示(请求的方式不匹配)

# 不带参数的访问形式:
# 访问地址:http://127.0.0.1:8000
@app.get("/")
async def test_one():
    return {"message": "My first fastapi project"}

# 带一个参数的时候的访问形式:
# 访问地址:http://127.0.0.1:8000/hello/小宁
@app.get("/hello/{name}")
async def hello(name: str):
    return {"hello": f"fastapi {name}"}

# 带一个参数的时候的访问形式:
# 访问地址:http://127.0.0.1:8000/my/小宁,21/长沙
@app.get("/my/{name},{age}/{addr}")
async def test_one(name: str, age: int, addr: str):
    return {"name": name, "age": age, "addr": addr}

启动uvicorn服务器:

# 在Terminal中输入:
# 语法:uvicorn 文件的相对路径:实例名 --reload
# reload:表示热启动,后端代码改变时,前端页面也会随之改变
uvicorn csdn.test_one:app --reload
运行结果:

注意事项:

1、传入参数的时候不能多传,也不能少传。

2、传入的参数一定要满足自己设置的http网址的层级格式。

3、传入的参数要满足函数设置的参数类型。

二、快速入门案例解析

2.1、union的可选参数

 创建 test_two.py:

from typing import Union  # 导⼊Union, ⽤于定义可选类型
from fastapi import FastAPI # 导⼊FastAPI,⽤于构建RESTful API

app = FastAPI()# 创建FastAPI实例

# 访问地址:http://127.0.0.1:8000/items/100?q=小宁
@app.get("/items/{item_id}")
# 定义路由,访问根路径调⽤read_item函数,传⼊item_id参数,并返回该参数对应的数据
# q: Union[str, None] = None ⽤于定义q的可选类型为str或int或None
# 如果http没有传入参数时候,默认为None,避免用户没传入参数,网页就跑不出来的情况
async def  read_item(item_id: int, q: Union[str,int, None] = None):
     return {"item_id": item_id, "q": q}
代码解析
  1. 路径参数{item_id} 动态匹配 URL 中的值,自动转换为整数类型。
  2. 查询参数q 通过 Union[str, None] 声明为可选参数。
  3. 自动验证:若传入非整数 item_id,FastAPI 返回 HTTP 422 错误。

启动uvicorn服务器:

 uvicorn csdn.test_two:app --reload

运行结果: 

2.2、uvicorn.run和pydantic类结合Apifox

在前面的课堂案例中,我们启动服务器都要打开终端Timinal中输入启动服务器的语句,那么每次启动都要输出启动的语句,那就很麻烦了,有没有什么办法可以要启动服务器和和之前一样只要点击运行就能够启动呢?所以我们接下来就会讲到uvicorn.run启动服务器。

在前面的内容我们讲过,浏览器默认的请求方式是get,那么假如我们的http请求方式是post等其他类型的时候怎么办呢,那么就需要使用Apifox软件了,这个大家可以直接官网直接下载。

创建 test_three.py:

from fastapi import FastAPI # 引⼊FastAPI类,⽤于创建⼀个应⽤
import uvicorn  # 引⼊uvicorn,⽤于启动服务
from typing import Union  #引⼊Union类,⽤于类型注解
from pydantic import BaseModel # 引⼊pydantic类,⽤于定义数据结构

app = FastAPI() # 创建⼀个应⽤,app是⼀个FastAPI实例

class Item(BaseModel):# 定义⼀个Item类,继承⾃BaseModel,⽤于定义请求体中的数据结构
    # 定义⼀个name属性,类型为str
    name: str
    # 定义⼀个price属性,类型为float
    price: float
    # 定义⼀个is_offer属性,类型为Union[bool, None],默认为None
    is_offer:Union[bool, None] = None

@app.get("/") # 装饰器,表示定义⼀个根路径的get请求
# 定义⼀个根路径的get请求,返回⼀个字典,键值分别为Hello和World
# async 表示异步请求,可以提⾼性能
# 测试访问:http://127.0.0.1:8000/
async def read_root():
     return {"Hello": "World"}

@app.get("/items/{item_id}")
# 定义⼀个路径参数为item_id的get请求,返回⼀个字典,键值分别为item_id和q
# Union[str, None] 表示q可以为str类型或者None类型,默认为None
# 测试访问:http://127.0.0.1:8000/items/3?q=abc
async def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

@app.put("/items/{item_id}")
# 测试访问:http://127.0.0.1:8000/items/3
async def update_item(item_id: int, item:Item):
 # 定义⼀个路径参数为item_id的put请求,返回⼀个字典,键值分别为item_name和item_id
     return {"item_name": item.name, "item_id": item_id,"item_price": item.price,"is_offer": item.is_offer}
# Item类类型传参数的时候要使用apidox中的body中的json格式(字典格式)


if __name__ == "__main__":
     # 启停⽅式:
     # 1.⽅式1指令式:
     # 服务器启动指令 uvicorn main:app --reload
     # fastDemo1:app 表示main.py⽂件中的app实例
     # 服务器停⽌指令 ctrl+c
     # 2.⽅式2界⾯式:
     # ⿏标右键启动----》run main.py
     # 界⾯右上⻆的停⽌按钮
     # 启动服务,host指定主机地址,port指定端⼝号,reload=True表示当代码发⽣变化时,⾃动重启服务
     # main:app---- 表示main.py⽂件中的app实例
     uvicorn.run("bbb:app", host="127.0.0.1", port=8080, reload=True)

运行结果:

 

这里是Apifox的操作截图:

三、路由分发

3.1、为什么需要路由分发?

在小型项目中,所有路由都写在 main.py 中尚可接受。但随着项目规模扩大(如构建包含用户、订单、商品等多个模块的电商系统),将所有路由集中在一个文件会导致:

  • 代码臃肿:数千行代码堆积,难以阅读和维护。
  • 协作困难:多人同时修改同一文件容易引发冲突。
  • 复用性差:相同功能的路由无法快速移植到其他项目。

路由分发(Route Distribution)通过 模块化拆分路由,将不同功能的路由分散到多个文件中,最终通过统一入口集成,完美解决上述问题。

3.2、图书管理系统

cbs.py源码
# 出版社分发路由配置
from fastapi import APIRouter

api_cbs = APIRouter()

@api_cbs.get("/get")
async def get_test():
    return {"methods": "出版社分发路由get方法"}

@api_cbs.post("/post")
async def post_test():
    return {"methods": "出版社分发路由post方法"}

@api_cbs.put("/put")
async def put_test():
    return {"methods": "出版社分发路由put方法"}

@api_cbs.delete("/delete")
async def delete_test():
    return {"methods": "出版社分发路由delete方法"}


ts.py源码
# 图书分发路由配置
from fastapi import APIRouter

api_ts = APIRouter() # 创建路由

@api_ts.get("/get")
async def get_test():
     return {"methods": "图书分发路由get⽅法"}

@api_ts.post("/post")
async def post_test():
    return {"methods": "图书分发路由post⽅法"}

@api_ts.put("/put")
async def put_test():
    return {"methods": "图书分发路由put⽅法"}

@api_ts.delete("/delete")
async def delete_test():
    return {"methods": "图书分发路由delete⽅法"}

zz源码

# 图书分发路由配置
from fastapi import APIRouter

api_ts = APIRouter() # 创建路由

@api_ts.get("/get")
async def get_test():
     return {"methods": "图书分发路由get⽅法"}

@api_ts.post("/post")
async def post_test():
    return {"methods": "图书分发路由post⽅法"}

@api_ts.put("/put")
async def put_test():
    return {"methods": "图书分发路由put⽅法"}

@api_ts.delete("/delete")
async def delete_test():
    return {"methods": "图书分发路由delete⽅法"}

main源码

from fastapi import FastAPI
from csdn.ts import api_ts
from csdn.cbs import api_cbs
from csdn.zz import api_zz
app = FastAPI()

#include_router()⽅法,⽤于将分发路由添加到app中,prefix参数为路由前缀,tags参数为标签
app.include_router(api_ts, prefix="/ts", tags=["图书"])
app.include_router(api_cbs, prefix="/cbs", tags=["出版社"])
app.include_router(api_zz, prefix="/zz", tags=["作者"])

运行结果:

提示:其他的需要访问的时候要使用Apifox来访问,因为其他的http的请求方式都不是get不能使用浏览器直接访问。

四、request对象的入门

在实际开发过程中,有些时候我们需要通过Request对象直接获取⼀些信息,如:我们希望获取客户端的 IP等信息,此时我们在路由操作函数中直接定义类型为Request的对象参数,就可以在代码中使⽤Request对象进⾏数据的获取。
假设在路由函数中定义了request:Request,那么该对象可以获取到哪些信息呢?

 

 代码示例:

from fastapi import FastAPI,Request
@app.put("/req/")
async def req(request: Request):
    req_method = request.method #请求的方式
    req_url = request.base_url # 请求的路径
    req_port = request.url.port  #请求的端口
    res_json = request.json() # 请求json数据
    res_arg1 = request.url.query # 请求查询参数1
    res_arg2 = request.query_params # 请求查询参数2
    print(f"请求的方式:{req_method},请求的路径:{req_url},#请求的端口:{req_port},请求json数据:{res_json}"
          f"请求查询参数1:{res_arg1},请求查询参数2:{res_arg2}")

在Aifox中发送请求:

参数:

json参数: 

运行结果:

五、总结

FastAPI 凭借其高性能和开发效率,已成为构建现代 API 的首选框架。通过本文的学习,你已经掌握了:

  1. 基础路由设计与参数验证
  2. 模块化路由管理(APIRouter)
  3. 请求元数据处理(Request 对象)
  4. 异步编程与高级功能
  5. 常见的http状态码提示的意思:
      200:请求成功的状态码
      404:页面找不到
      422:请求体中数据有问题(格式不正确,名字匹配不对)
      405:请求的方式不匹配(如路径是get形式,但是函数上面写的是其他的请求类型)
      500:后台服务器程序出错d

无论是构建微服务、实时应用还是数据处理接口,FastAPI 都能提供强大的支持。下一步可探索其与 SQL 数据库、WebSocket 或分布式任务队列的集成,进一步提升项目复杂度。

延伸阅读

  • 官方文档:FastAPI Documentation
  • 实战项目:FastAPI + SQLAlchemy 用户管理系统

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

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

相关文章

Leetcode做题记录----2

1、两数之和 思路: 1、不能使用相同元素,可以想到哈希表,,C#中可以通过字典建立当前值和下标的关系 2、显然,依次判断数组中的每个数即可 3、定义other target - num[ i ] 这个other就是我们用于在字典中进行寻找…

批量合并 Word 文档,支持合并成一个 Word,也支持按文件夹合并

我们经常会碰到需要将多个 Word 文档批量合并成一个 Word 文档的场景,比如需要合并后打印、合并后方便整理存档等等。如果是人工的操作,会非常的麻烦。因此我们通常会借助一些批量处理脚本或者寻找批量处理的工具来帮我们实现批量合并 Word 文档的操作。…

项目实操分享:一个基于 Flask 的音乐生成系统,能够根据用户指定的参数自动生成 MIDI 音乐并转换为音频文件

在线体验音乐创作:AI Music Creator - AI Music Creator 体验者账号密码admin/admin123 系统架构 1.1 核心组件 MusicGenerator 类 负责音乐生成的核心逻辑 包含 MIDI 生成和音频转换功能 管理音乐参数和音轨生成 FluidSynth 集成 用于 MIDI 到音频的转换 …

神经网络为什么要用 ReLU 增加非线性?

在神经网络中使用 ReLU(Rectified Linear Unit) 作为激活函数的主要目的是引入非线性,这是神经网络能够学习复杂模式和解决非线性问题的关键。 1. 为什么需要非线性? 1.1 线性模型的局限性 如果神经网络只使用线性激活函数&…

动态规划详解(二):从暴力递归到动态规划的完整优化之路

目录 一、什么是动态规划?—— 从人类直觉到算法思维 二、暴力递归:最直观的问题分解方式 1. 示例:斐波那契数列 2. 递归树分析(以n5为例) 3. 问题暴露 三、第一次优化:记忆化搜索(Memoiza…

ubuntu下在pycharm中配置已有的虚拟环境

作者使用的ubuntu系统位于PC机上的虚拟机。系统版本为: 在配置pycharm解释器之前你需要先创建虚拟环境以及安装pycharm。 作者创建的虚拟环境位于/home/topeet/miniconda3/envs/airproject/,如下图所示: 作者安装的pycharm版本为2023社区…

爬虫中一些有用的用法

文本和标签在一个级别下 如果文本和a标签在一个级别下 比如: # 获取a标签后的第一个文本节点text_node a.xpath(following-sibling::text()[1])[0].strip() 将xpath的html代码转换成字符串 etree.tostring(root, pretty_printTrue, encoding"utf-8")…

DeepIn Wps 字体缺失问题

系统缺失字体 Symbol 、Wingdings 、Wingdings2、Wingdings3、MT—extra 字体问题 问了下DeepSeek 在应用商店安装或者在windows 里面找 装了一个GB-18030 还是不行 在windows里面复制了缺失的字体 将字体复制到DeepIn 的字体目录(Ubuntu 应该也是这个目录&am…

【webrtc debug tools】 rtc_event_log_to_text

一、rtc_event_log 简介 在学习分析webrtc的过程中,发现其内部提供了一个实时数据捕获接口RtcEventLog。通过该接口可以实时捕获进出webrtc的RTP报文头数据、音视频配置参数、webrtc的探测数据等。其内容实现可参考RtcEventLogImpl类的定义。其文件所在路径 loggin…

数字IC后端项目典型问题(2025.03.10数字后端项目问题记录)

小编发现今天广大学员发过来的问题都比较好,立即一顿输出分享给大家(每天都有好多种类的数字后端问题)。后续可能会经常通过这种方式来做分享。其实很多问题都是实际后端项目中经常遇到的典型问题。希望通过这种方式的分享能够帮助到更多需要…

Redis 持久化详解:RDB 与 AOF 的机制、配置与最佳实践

目录 引言 1. Redis 持久化概述 1.1 为什么需要持久化? 1.2 Redis 持久化的两种方式 2. RDB 持久化 2.1 RDB 的工作原理 RDB 的触发条件 2.2 RDB 的配置 2.3 RDB 的优缺点 优点 缺点 3. AOF 持久化 3.1 AOF 的工作原理 AOF 的触发条件 3.2 AOF 的配置…

说一下spring的事务隔离级别?

大家好,我是锋哥。今天分享关于【说一下spring的事务隔离级别?】面试题。希望对大家有帮助; 说一下spring的事务隔离级别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring的事务隔离级别是指在数据库事务管理中…

Java 大视界 -- 基于 Java 的大数据实时数据处理框架性能评测与选型建议(121)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

NAT NAPT

NAT NAT(Network Address Translation,网络地址转换) 主要用于在不同网络(如私有网络和公共互联网)之间进行 IP 地址转换,解决IP 地址短缺问题,并提供一定的安全性。 IPv4 地址是 32 位&#xf…

harmonyOS(鸿蒙)— 网络权限(解决app网络资源无法加载,图片无法显示)

harmonyOS系列 harmonyOS(网络权限) 一、问题梳理二、代码及图示 一、问题梳理 在鸿蒙app的开发里会有联网业务无法加载,图片无法显示的情况,多半是系统的网络权限没有申请,所以无法使用需要网络加载的资源&#xff0…

Python毕业设计选题:基于django+vue的疫情数据可视化分析系统

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 员工管理 疫情信息管理 检测预约管理 检测结果…

清华同方国产电脑能改windows吗_清华同方国产系统改win7教程

清华同方国产电脑能改windows吗?清华同方国产电脑如果采用的是兆芯kx-6000系列或kx-7000系列以及海光c86 3250 3350 X86架构处理器可以安装windows。在安装win7时bios中要关闭“安全启动”和开启legacy传统模式支持,如果是NVME接口的固态硬盘&#xff0c…

【redis】string应用场景:缓存功能和计数功能

文章目录 缓存功能实现思路存在的问题伪代码实现 记数功能实现思路统计伪代码实现 缓存功能 实现思路 整体的思路: 应用服务器访问数据的时候,先查询 Redis 如果 Redis 上数据存在了,就直接从 Redis 读取数据交给应用服务器,不继…

vue el-select 省市区三级联动 vue + element-ui使用第三方插件实现省市区三级联动

vue el-select 省市区三级联动 vue使用第三方插件实现省市区三级联动 网上找了好多教程,都是使用el-cascader级联选择器的省市区选择器,但是几乎没有三个单独的el-select的进行关联的三级省市联动组件效果 第一步:先安装省市区element-ui的插件 npm install element-china-a…

数学建模:MATLAB强化学习

一、强化学习简述 强化学习是一种通过与环境交互,学习状态到行为的映射关系,以获得最大积累期望回报的方法。包含环境,动作和奖励三部分,本质是智能体通过与环境的交互,使得其作出的动作所得到的决策得到的总的奖励达…