Python从入门到精通1:FastAPI

引言

在现代 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 用户管理系统

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Service与Ingress:如何将你的应用暴露给世界

引言:从“内部通讯”到“对外开放” 想象Kubernetes集群是一座繁忙的办公楼,每个Pod(容器)是楼内的员工。 Service 就像前台的接待员,负责将外部电话(请求)转接到正确的员工(Pod&am…

【Linux学习篇】--开发工具第一期

目录 1. Linux编辑器的使用--vim使用 1.1 vim的基本概念 1.2 vim基本操作 1.3 vim正常模式(指令模式)命令集 1.4 vim末行模式命令集 1.5 vim配置 2. Linux编译器-gcc/g使用 2.1 背景知识 2.2 gcc如何完成 2.3 gcc选择项 1. Linux编…

Elastic:AI 会开始取代网络安全工作吗?

作者:来自 Elastic Joe DeFever 不会,但它正在从根本上改变这些工作。 生成式 AI (GenAI) 正迅速成为日常安全工作流程中的一个重要组成部分。那么,它是合作伙伴还是竞争对手? GenAI 技术在安全堆栈几乎每个方面的广泛应用&#…

Windows 11 IoT 企业版 LTSC 2025 特制适度 22635.5025

文件: Windows 11 IoT 企业版 LTSC 2025 特制适度 22635.5025 install.esd 大小: 2.57G(2768694310 字节) 修改时间: 2025年3月9日, 星期日, 11 : 40 : 15 MD5: BFCB23BC2F78CA9243FFA68D5DDDDFC1 SHA1: C4D8BBF8B8D8E0E8E49DE5E9CC8D7F77385A745A CRC32…

Lab18_ SQL injection with filter bypass via XML encoding

文章目录 前言:进入实验室构造 payload 前言: 实验室标题为: 通关 XML 编码绕过过滤器的 SQL 注入 简介: 此实验室的库存检查功能中存在 SQL 注入漏洞。查询结果在应用程序的响应中返回,因此您可以使用 UNION 攻击…

kali虚拟机登录页面发癫 大写锁定输入不了密码

不知道怎么了 总是发癫 重启切换太麻烦了 还有时候不成功 kali其实可以开启虚拟键盘 如下 就解决的 发癫kali 发癫 发癫

【汇编语言】单片机程序执行过程

一、任务需求 指示灯LED4闪烁,亮0.5秒,灭0.5秒,无限循环 二、针对硬件的编程 1、确定原理图2、确定硬件的物理关系 三、设计步骤 1.用自己的语言描述工作流程 1.1指示灯LED4亮1.2延时0.5秒1.3指示灯LED4灭1.4延时0.5秒1.5跳转到1.1步 …

【Linux篇】调试器-gdb/cgdb使用

📌 个人主页: 孙同学_ 🔧 文章专栏:Liunx 💡 关注我,分享经验,助你少走弯路! 文章目录 1. 前言2.关于gdb2.1 快速认识gdb2.2 安装cgdb2.3 gdb命令2.4 调试 & 断点 3.常见技巧3.…

ThinkPhp 5 安装阿里云内容安全(绿化)

composer require alibabacloud/green-20220302 首先要把php5(不支持php7)的执行文件设置到PATH环境变量 此外还要先执行composer update php5.5和php5.6的区别 5.5认为 <? 开头的也是php文件&#xff0c;包括 <?php 5.6认为 <? 开头的不是php文件&#xff0c;只…

Level DB --- 写流程计算

写流程架构Level DB --- 写流程架构-CSDN博客已经介绍&#xff0c;写流程计算包括写日志&#xff0c;和将kv插入到memtable中。 写日志和写memtable 用户端插入的kv数据&#xff0c;既要写日志同时也要写memtable。写日志是指kv记录要同步到日志文件中&#xff1b;写memtable…

JavaWeb-servlet6中过滤器和监听器

Servlet 过滤器 Servlet 过滤器&#xff08;Filter&#xff09;与 Servlet 十分相似&#xff0c;但 Filter 具有拦截客户端请求的功能&#xff0c; Filter 可以改变请求中的内容&#xff0c;以便满足实际开发中的需要。对于程序开发人员而言&#xff0c; Filter 实质上就是 We…

SQL PLUS与Oracle数据库的交互

一、SQL Plus与数据库的交互 可以 使用2种基本类型的命令与数据库进行交互&#xff1a; 服务器执行的命令&#xff1a;SQLQ命令&#xff08;以&#xff1b;结束&#xff09;和PL/SQL程序块&#xff08;以/结束&#xff09; 本地命令&#xff1a;SQL Plus命令 二、设置SQL Pl…

Git系列之git tag和ReleaseMilestone

以下是关于 Git Tag、Release 和 Milestone 的深度融合内容&#xff0c;并补充了关于 Git Tag 的所有命令、详细解释和指令实例&#xff0c;条理清晰&#xff0c;结合实际使用场景和案例。 1. Git Tag 1.1 定义 • Tag 是 Git 中用于标记特定提交&#xff08;commit&#xf…

WinForm模态与非模态窗体

1、模态窗体 1&#xff09;定义&#xff1a; 模态窗体是指当窗体显示时&#xff0c;用户必须先关闭该窗体&#xff0c;才能继续与应用程序的其他部分进行交互。 2&#xff09;特点&#xff1a; 窗体以模态方式显示时&#xff0c;会阻塞主窗体的操作。用户必须处理完模态窗体上…

关闭Windows安全中心,解析与实操指南

在这个数字化时代&#xff0c;Windows操作系统作为我们日常工作和娱乐的基石&#xff0c;其内置的Windows安全中心&#xff08;Windows Defender Security Center&#xff09;在保护系统安全方面扮演着重要角色。然而&#xff0c;对于某些高级用户或特定需求场景&#xff0c;关…

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 JSP 标签库:自定义标签的开发与应用

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、JSP 标签…

IDEA与Maven使用-学习记录(持续补充...)

1. 下载与安装 以ideaIU-2021.3.1为例&#xff0c;安装步骤&#xff1a; 以管理员身份启动ideaIU-2021.3.1修改安装路径为&#xff1a;D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】&#xff08;可选&#xff09;、【打开文件夹作为项目】&…

JS中的闭包(closures)一种强大但易混淆的概念

JavaScript 中的闭包&#xff08;closures&#xff09;被认为是一种既强大又易混淆的概念。闭包允许函数访问其外部作用域的变量&#xff0c;即使外部函数已执行完毕&#xff0c;这在状态维护和回调函数中非常有用。但其复杂性可能导致开发者的误解&#xff0c;尤其在变量捕获和…

根据指定 Excel 模板将 Excel 明细数据生成新的 Excel 文档

在日常工作中&#xff0c;我们常常需要生成 Excel 文档&#xff0c;例如将 Excel 数据 自动转换为独立的 Excel 文件。在这种需求下&#xff0c;如何高效地将 Excel 表格 中的每一条数据生成一个对应的 Excel 文档&#xff0c;并且让文档中的内容根据 Excel 数据动态变化&#…

前端杂的学习笔记

什么是nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 Nginx是一款轻量级的Web 服务器/反向代理服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;并且支持热部署&#xff0c;启动简单&#xff0c;可以做到7*24不间断运行 正代和反代 学习nginx&a…