【Python】FastAPI入门

article/2025/8/15 18:50:51

文章目录

  • 第一节:FastAPI入门
    • 一、FastAPI框架介绍
      • 什么是ASGI服务(WSGI)
      • 1、补充Web开发
        • 1)Web前端开发
        • 2)Web后端开发
    • 二、FastAPI安装
      • 1、安装Python虚拟环境
      • 2、安装FastAPI
    • 三、第一个FastAPI案例
      • 1、访问接口和文档
      • 2、接口文档半天打不开的解决
      • 3、总结
        • 1)uvicorn命令说明:
        • 2)app变量
        • 3)请求路径(路由)
        • 4)请求方法(操作)
        • 5)路由+请求方法 +函数的映射
        • 6)返回响应
    • 四、路由参数
      • 1、定义参数的类型
      • 2、路由匹配的顺序
      • 3、预设值参数

在这里插入图片描述

第一节:FastAPI入门

一、FastAPI框架介绍

FastAPI是一个现代、快速的Python Web框架,用于构建API。它基于Python 3.6+的类型提示特性,使得代码更加简洁且易于绶护。

关键特性:

快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。

高效编码:提高功能开发速度约 200% 至 300%。

更少 bug:减少约 40% 的人为(开发者)导致错误。
智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
简单:设计的易于使用和学习,阅读文档的时间更短。
简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
健壮:生产可用级别的代码。还有自动生成的交互式文档。
标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。

FastAPI 站在巨人的肩膀上:

  • Starlette 用于构建 Web 部件:Starlette 是一个轻量级的 ASGI 框架和工具包,特别适合用来构建高性能的 asyncio 服务.
  • Pydantic 用于数据的操作:python 中用于数据接口定义检查与设置管理的库。

什么是ASGI服务(WSGI)

WSGI,(WEB SERVER GATEWAY INTERFACE),Web服务器网关接口,是一种Web服务器网关接口,它是一个Web服务器(如Nginx,uWSGI等服务器)与Web应用(如Flask框架写的程序)通信的一种规范。当前运行在WSGI协议之上的Web框架有Bottle,Flask,Django

ASGI:异步网关协议接口( Asynchronous Server Gateway Interface ) ,一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型,包括HTTP,HTTP2和WebSocket。

WSGI和ASGI的区别

WSGI是基于HTTP协议模式的,不支持WebSocket,而ASGI的诞生则是为了解决Python常用的WSGI不支持当前Web开发中的一些新的协议标准。同时,ASGI对于WSGI原有的模式的支持和WebSocket的扩展,即ASGI是WSGI的扩展。

1、补充Web开发

Web应用开发主要是建立在B/S架构模式下,衍生出来的一系列web应用程序,即主要是基于浏览器的应用程序开发,这也是web应用程序开发的基础,比如淘宝、京东、当当网等。Web开发在近年来,随着本身技术的突破以及移动设备的普及,基于web领域的开发,也出现了明确的岗位职责分工,一个web互联网产品中,基本上会分为web UI设计、Web前端开发以及web后端开发。

1)Web前端开发

Web前端开发用到的编程语言主要有javascript,以及伴随有标记性文本语言html和样式渲染方式CSS。以及近年来衍生出来的一批优秀web前端框架,使web前端在应用构建方面的效率得到显著提升。另外nodeJs的出现,越来越多的web前端开发人员开始走入服务端编程领域,甚至在一些项目中扮演着web全栈开发的角色。

2)Web后端开发

Web后端开发,主要用到的语言有python、php、java等,当然随着nodeJs的兴起,也成为近年来服务端开发的另一种选择。

Web应用程序开发是基于浏览器的,浏览器本身已经解决了多平台性兼容的问题,所以web开发一般是无需考虑跨平台所面临的兼容性问题。但是,web开发领域需要解决的有另一类问题,那便是多端兼容以及融合的问题,虽然web是基于浏览器的,没有跨平台的问题,但多端的快速发展,是web开发领域的新问题,即PC端、移动端以及当下比较火热的各类小程序端。

二、FastAPI安装

1、安装Python虚拟环境

为什么要使用虚拟环境

  1. 项目部署时,直接导出项目对应的环境中的库就可以了;
  2. 同时开发多个项目,各自项目使用的python版本不同,譬如一个是python2,另一个是python3,那么需要来回的切换python版本;
  3. 当你同时开发多个项目时,特别是多个项目使用同一个库,譬如:django,但是各自项目使用的django的版本不一致时,那么你在开发这些项目时,需要来回的卸载和安装不同的版本,因为同一个python环境中,同名的库只能有一个版本。

虚拟环境的安装步骤

  1. 安装好python环境

  2. 安装虚拟环境库,在cmd中输入:

    pip install virtualenv 
    
  3. 创建虚拟环境,在cmd中切换到需要创建虚拟环境的目录下,执行:

    virtualenv env_name 
    
  4. 激活虚拟环境,在cmd中进入到 第三步创建的 env_name/Scripts 目录下,执行:

    activate
    

    执行成功后,在cmd中,当前输入行前面会有 (env_name) 的前缀

    在当前状态下,使用 pip 就是在虚拟环境中安装第三方库了

  5. 退出虚拟环境,cmd中输入:

    deactivate
    

2、安装FastAPI

需要安装所有的可选依赖及对应功能,包括了 uvicorn,你可以将其用作运行代码的服务器。

pip install fastapi[all] -i https://pypi.douban.com/simple/

你也可以分开来安装。

假如你想将应用程序部署到生产环境,你可能要执行以下操作:

pip install fastapi

并且安装 uvicorn来作为服务器:

pip install "uvicorn[standard]"

三、第一个FastAPI案例

创建一个main.py

from fastapi import FastAPIapp = FastAPI()@app.get("/")
def root():return 'hello'@app.get("/hello/{name}")
def say_hello(name: str):return {"message": f"Hello {name}"}# 可以不要
if __name__ == "__main__":import uvicornuvicorn.run(app, host="127.0.0.1", port=8000)

1、访问接口和文档

2、接口文档半天打不开的解决

这个接口文档调用了一个 js脚本,这个脚本是部署在国外的,总之 就是因为这个原因导致我们没法访问了,由此我们需要把这个脚本从网上下载下来,放到本地,把此处调用国外的脚本变成调用我们自己本地的,即可。

1)下载这些国外服务器的资源到一个static目录中

2)复制到项目中

3)修改fastapi的源代码

4) 在app中注册static目录

5)打开接口文档

3、总结

1)uvicorn命令说明:

uvicorn main:app 命令含义如下:

  • mainmain.py 文件(一个 Python「模块」)。
  • app:在 main.py 文件中通过 app = FastAPI() 创建的对象。
  • --reload:让服务器在更新代码后重新启动。仅在开发时使用该选项。
2)app变量

这里的变量 app 会是 FastAPI 类的一个实例 变量名字。这个实例将是创建你所有 API 的主要交互对象。

也可以修改app变量名字:

from fastapi import FastAPImy_awesome_api = FastAPI()@my_awesome_api.get("/")
def root():return {"message": "Hello World"}
3)请求路径(路由)

请求路径指的是 URL 中从第一个 / 起的后半部分。所以,在一个这样的 URL 中:

http://example.com/items/foo
http://127.0.0.1/items/foo

那么,真正的请求路径(路由)是:/items/foo

在FastAPI中,路由的配置是通过: 装饰器 完成的。

4)请求方法(操作)

在 HTTP 协议中,你可以使用以下的其中一种(或多种)请求方法 与每个路径进行通信。

通常使用:

  • POST:创建数据。
  • GET:读取数据。
  • PUT:更新数据。
  • DELETE:删除数据。
  • PATCH: 修改单一数据

配置请求方法:

  • @app.post()
  • @app.put()
  • @app.delete()
  • @app.get()

以及更少见的:

  • @app.options()
  • @app.head()
  • @app.patch()
  • @app.trace()
5)路由+请求方法 +函数的映射
  • 路径 :是 /
  • 操作 :是 get
  • 函数 :是位于「装饰器」下方的函数(位于 @app.get("/") 下方)
@app.get("/")
def root():return {"message": "Hello World"}
6)返回响应
from fastapi import FastAPIapp = FastAPI()@app.get("/")
def root():return {"message": "Hello World"}  # 返回响应

你还可以返回一个 dictlist,像 strint 一样的单个值,等等。你还可以返回 Pydantic 模型。还有许多其他将会自动转换为 JSON 的对象和模型(包括 ORM 对象等)。

四、路由参数

你可以使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量":

@app.get("/items/{item_id}")
def read_item(item_id):return {"item_id": item_id}

路径参数 item_id 的值将作为参数 item_id 传递给你的函数。所以,如果你运行示例并访问 http://127.0.0.1:8000/items/foo,将会看到如下响应:

{"item_id":"foo"}

1、定义参数的类型

你可以使用标准的 Python 类型标注为函数中的路径参数声明类型。

@app.get("/items/{item_id}")
def read_item(item_id: int):return {"item_id": item_id}

在这个例子中,item_id 被声明为 int 类型。FastAPI 通过上面的类型声明提供了对请求的自动"解析"。

同时还提供数据校验功能:

如果你通过浏览器访问 http://127.0.0.1:8000/items/foo,你会看到一个清晰可读的 HTTP 错误:

{"detail": [{"loc": ["path","item_id"],"msg": "value is not a valid integer","type": "type_error.integer"}]
}

因为路径参数 item_id 传入的值为 "foo",它不是一个 int

你可以使用同样的类型声明来声明 strfloatbool 以及许多其他的复合数据类型。

2、路由匹配的顺序

由于路由匹配操作是按顺序依次运行的,你需要确保路径 /users/me 声明在路径 /users/{user_id}之前:

@app.get("/users/me")
def read_user_me():return {"user_id": "the current user"}@app.get("/users/{user_id}")
def read_user(user_id: str):return {"user_id": user_id}

否则,/users/{user_id} 的路径还将与 /users/me 相匹配,"认为"自己正在接收一个值为 "me"user_id 参数。

3、预设值参数

如果你有一个接收路径参数的路径操作,但你希望预先设定可能的有效参数值,则可以使用标准的 Python Enum 类型。

Python中的枚举数据类型:是指列出有穷集合中的所有元素,即一一列举的意思。在Python中,枚举可以视为是一种数据类型,当一个变量的取值只有几种有限的情况时,我们可以将其声明为枚举类型。例如表示周几的这一变量weekday,只有七种可能的取值,我们就可以将其声明为枚举类型。

from enum import Enum
class Weekday(Enum):monday = 1tuesday = 2wednesday = 3thirsday = 4friday = 5saturday = 6sunday = 7print(Weekday.wednesday)         # Weekday.wednesday  
print(type(Weekday.wednesday))   # <enum 'Weekday'>
print(Weekday.wednesday.name)    # wednesday
print(Weekday.wednesday.value)   # 3
from enum import Enum
from fastapi import FastAPIclass ModelName(str, Enum):alexnet = "alexnet"resnet = "resnet"lenet = "lenet"app = FastAPI()@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):if model_name is ModelName.alexnet:return {"model_name": model_name, "message": "Deep Learning FTW!"}if model_name.value == "lenet":return {"model_name": model_name, "message": "LeCNN all the images"}return {"model_name": model_name, "message": "Have some residuals"}

http://www.hkcw.cn/article/gkImlAJFkX.shtml

相关文章

【C++】踏上C++学习之旅(四):细说“内联函数“的那些事

文章目录 前言1. "内联函数"被创造出来的意义2. 内联函数的概念2.1 内联函数在代码中的体现2.2 普通函数和内联函数的汇编代码 3. 内联函数的特性&#xff08;重点&#xff09;4. 总结 前言 本章来聊一聊C的创作者"本贾尼"大佬&#xff0c;为什么要创作出…

C++《string的模拟实现》

在之前的篇章C《string》中我们已经了解了string中关于构造、容量、访问、修改操作等函数的功能&#xff0c;以及初步学习了这些函数的使用该如何使用。通过学习string内的各个函数后我们可以发现在解决一些要使用到字符串的环境下有了string内的这些函数操作能大大简化&#x…

2025华为OD机试真题最新题库 (B+C+D+E+2025A+2025B卷) + 在线OJ在线刷题使用(C++、Java、Python C语言 JS合集)(正在更新2025B卷,目前已收录710道)

2025年&#xff0c;已经开始使用AB卷题库&#xff0c;题目和往期一样&#xff0c;旧题加新题的组合&#xff0c;有题目第一时间更新&#xff0c;大家可以跟着继续学习&#xff0c;目前使用复用题较多&#xff0c;可在OJ上直接找到对应的AB卷学习&#xff0c;可以放心学习&#…

基于Java的不固定长度字符集在指定宽度和自适应模型下图片绘制生成实战

目录 前言 一、需求介绍 1、指定宽度生成 2、指定列自适应生成 二、Java生成实现 1、公共方法 2、指定宽度生成 3、指定列自适应生成 三、总结 前言 在当今数字化与信息化飞速发展的时代&#xff0c;图像的生成与处理技术正日益成为众多领域关注的焦点。从创意设计到数…

【C++】 —— 笔试刷题day_29

一、排序子序列 题目解析 一个数组的连续子序列&#xff0c;如果这个子序列是非递增或者非递减的&#xff1b;这个连续的子序列就是排序子序列。 现在给定一个数组&#xff0c;然后然我们判断这个子序列可以划分成多少个排序子序列。 例如&#xff1a;1 2 3 2 2 1 可以划分成 …

企业微信自建应用实现接收消息和发送消息功能(python)

# 这一周我不断的琢磨企业微信自建应用并且实现了自建应用的消息接收和发送功能 1.笔记&#xff0c;记录 第一步&#xff1a;打开企业微信后台 https://work.weixin.qq.com 1.1 如果没有企业可以在这里申请&#xff0c;如果有可以直接扫码登录 1.2 打开后台-应用管理-自建应用…

【Rust多线程】Rust并发编程,如何轻松实现无畏并发

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

2025粤港澳信息学创新大赛备考指南Python,C++,图形化历年真题训练题

官方指导文件 训练题目 ZCM5:Python小学组-单项选择题 1.小明安装软件的时候发现软件要求Windows环境&#xff0c;这 个要求限制的是? A.操作系统 B.计算机内存 C.网络设置 D.程序语言 答案‌&#xff1a;A. 操作系统 解析‌&#xff1a;软件运行的环境通常指的是操作系统&am…

【C++指南】“单身狗问题”——只出现一次的数字 系列问题

. &#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 文章目录 引言一、只出现一次的数字&#xff08;一&#xff09;简单题目描述解题思路代码实现及解释 二…

优化 InfluxDB 写入性能:高效批处理策略实战指南

在处理高吞吐量时序数据时&#xff0c;合理运用批处理&#xff08;Batching&#xff09;策略是提升 InfluxDB 写入性能的关键。本文介绍 时间驱动、大小驱动和混合批处理策略&#xff0c;并通过 Python 代码示例展示如何优化数据写入&#xff0c;平衡 延迟与吞吐量。同时&#…

RedwoodJS:乱拳打倒老师傅 NextJS!

RedwoodJS 是一个全栈的 JavaScript/TypeScript 框架&#xff0c;其作用是帮助开发者高效地构建现代化的 Web 应用。它将前端、后端和数据库集成在一起&#xff0c;并使用一种“JAMstack”架构&#xff08;JavaScript、API 和 Markup&#xff09;来构建可扩展的应用程序。 Star…

【C++】 —— 笔试刷题day_18

一、压缩字符串(一) 题目解析 题目给定一个字符str&#xff0c;让我们将这个字符串进行压缩&#xff1b; **压缩规则&#xff1a;**出现多次的字符压缩成字符数字&#xff1b;例如aaa压缩成a3。如果字符值出现一次&#xff0c;1不用写。 算法思路 这道题总的来说就非常简单了…

谷歌浏览器如何禁用javaScript

通过禁用js&#xff0c;可以访问一些设置权限的内容。 Chrome 地址栏输入 chrome://settings/content 回车。 找到 JavaScript 选项。 切换为 不允许网站使用 JavaScript。 地址栏输入&#xff1a; chrome://settings/content/javascript?searchJavaScript Firefox 地址栏输入…

Java从入门到“放弃”(精通)之旅——类和对象全面解析⑦

Java从入门到“放弃”&#xff08;精通&#xff09;之旅&#x1f680;——类和对象全面解析⑦ 一、面向对象初探 1.1 什么是面向对象&#xff1f; Java是一门纯面向对象的语言(OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&am…

【Golang】第七弹----map

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 1基本介绍 Go语言中的 map …

C/C++程序员为什么要了解汇编?了解汇编有哪些好处?如何学习汇编?

目录 1、概述 2、从汇编的角度去理解问题的若干实例说明 2.1、使用空指针去访问类的数据成员或调用类的虚函数为什么会引发崩溃? 2.2、从汇编代码的角度去理解多线程的执行细节,去理解多线程在访问共享资源时为什么要加锁 2.3、使用Windbg静态分析dump时先从崩溃的那条汇…

基于谐波线性化方法的跟网型GFL并网变流器/VSC宽频序阻抗建模及扫频(Matlab/Simulink平台)及文献复现

目录 1、课程及模型介绍 2、谐波线性化方法介绍 3、跟网型及构网型并网变流器的特点 4、跟网型变流器/VSC拓扑及控制结构 5、不同坐标系下VSC序阻抗建模推导过程 5.1 abc三相坐标系下的VSC序阻抗建模 5.2 d-q旋转坐标系下的VSC序阻抗建模 5.2.1 Park变换及频率偏移效应…

C++“STL之String”

​ 🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:C++入门 目录 ​编辑 前言 一、STL简介 1.1 STL是什么? 1.2 STL的版本(这个不是很重要了解即可) 1.3 STL的六大组件 二、 String类 2.1为什么要学习String类? 2.1.1 C语言中的字符串…

C++之多态

开始新的征程啦———多态&#xff0c;它也是C的三大特性之一。 文章目录 一、多态的概念二、多态的定义和实现2.1多态的定义2.2 实现动态多态所需要的条件&#xff08;2个&#xff09;2.3 虚函数的定义2.4 虚函数的重写/覆盖2.5 虚函数重写中的问题2.5.1 协变2.5.2 析构函数的…

【第十六届蓝桥杯省赛】比赛心得与经验分享(PythonA 组)

文章目录 一、我的成绩二、我的备赛经历三、如何备赛&#xff08;个人观点&#xff09;1. 基础语法2. 数据结构3. 算法4. 数学 四、做题技巧与注意事项五、我的题解试题A 偏蓝 &#x1f3c6;100%试题B IPV6 &#x1f3c6;0%试题C 2025图形 &#x1f3c6;100%试题D 最大数字 &am…