当前位置: 首页 > news >正文

【FastAPI】--基础教程

目录

1.FastAPI--简介

2.FastAPI--环境

3.FastAPI--Hello World

4.FastAPI--openAPI规范

5. FastAPI--Uvicorn服务器

6. FastAPI--路径参数

7.FastAPI--查询参数

8.FastAPI--参数验证

9.FastAPI--Pydantic 库

10.FastAPI--Request 请求主体


1.FastAPI--简介

FastAPI 是一个现代 Python 网络框架,在构建 API 方面非常高效。 FastAPI 由 Sebastian Ramirez 于 2018 年 12 月开发。FastAPI 0.68.0 是当前可用的版本。 最新版本需要 Python 3.6 或以上版本。 它是 Python 最快的 Web 框架之一

  • 由于它基于 Starlette 和 Pydantic 库的功能,其性能名列前茅,与 NodeJS 和 Go 相当。

  • 除了提供高性能之外,FastAPI 还提供显着的开发速度、减少代码中人为引起的错误、易于学习并且完全可用于生产。

  • FastAPI 完全兼容著名的 API 标准,即 OpenAPI 和 JSON 模式。

2.FastAPI--环境

要安装 FastAPI(最好在虚拟环境中),请使用 pip 安装程序。

pip3 install fastapi   Pydantic  Starlette 

FastAPI 依赖于 Starlette 和 Pydantic 库,因此它们也会被安装。

FastAPI 不附带任何内置服务器应用程序。 要运行 FastAPI 应用程序,您需要一个名为 uvicorn 的 ASGI 服务器,所以也使用 pip 安装程序安装它。 它还将安装 uvicorn 的依赖项——asgiref、click、h11 和 typing-extensions

pip3 install uvicorn

3.FastAPI--Hello World

创建 FastAPI 应用程序的第一步是声明 FastAPI 类的应用程序对象。

from fastapi import FastAPI
app = FastAPI()

app 对象是应用程序与客户端浏览器交互的主要点。 uvicorn 服务器使用这个对象来监听客户端的请求。

下一步是创建路径操作。 路径是一个 URL,当客户端访问该 URL 时,它会调用访问映射到 HTTP 方法之一的 URL,并执行关联的功能。我们需要将视图函数绑定到 URL 和相应的 HTTP 方法。 例如,index()函数对应'/'路径和'get'操作。

@app.get("/")
async def root():return {"message": "Hello World"}

该函数返回 JSON 响应,但是,它可以返回 dict、list、str、int 等。它还可以返回 Pydantic 模型。

hello_world.py

from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():return {"message": "Hello World"}

终端运行:

 uvicorn hello_world:app --reload

 

4.FastAPI--openAPI规范

在浏览器中输入以下 URL,自动生成交互式文档。

http://127.0.0.1:8000/docs

FastAPI 使用 Swagger UI 生成此文档。 浏览器会显示如下 

单击"try it out" 按钮,然后单击随后出现的"Execute" 按钮。

可以看到内部执行的Curl命令,请求URL,响应头,以及服务器响应的JSON格式。

FastAPI 使用 OpenAPI 规范生成模式。 该规范决定了如何定义 API 路径、路径参数等。OpenAPI 标准定义的 API 模式决定了数据如何使用 JSON 模式发送。 从浏览器访问 http://127.0.0.1:8000/openapi.json。 将显示如下格式整齐的 JSON 响应 − 

{"openapi": "3.1.0","info": {"title": "FastAPI","version": "0.1.0"},"paths": {"/": {"get": {"summary": "Index","operationId": "index__get","responses": {"200": {"description": "Successful Response","content": {"application/json": {"schema": {}}}}}}}}
}

FastAPI 还支持 Redoc ( https://github.com/Redocly/redoc) 提供的另一种自动文档化方法。

在浏览器的地址栏中输入 http://localhost:8000/redoc 作为 URL。

5. FastAPI--Uvicorn服务器

与 Flask 框架不同的是,FastAPI 不包含任何内置的开发服务器。 因此,我们需要Uvicorn。 它实现了 ASGI 标准,而且速度很快。 ASGI 代表异步服务器网关接口

符合 WSGI(Web 服务器网关接口——旧标准)的 Web 服务器不适合 asyncio 应用程序。 实现 ASGI 规范的 Python Web 框架(例如 FastAPI)提供高速性能,可与使用 Node 和 Go 构建的 Web 应用程序相媲美。

Uvicorn 使用 uvloop 和 httptools 库。 它还提供对 HTTP/2 和 WebSockets 的支持,这是 WSGI 无法处理的。 uvloop id 类似于内置的 asyncio 事件循环。 httptools 库处理 http 协议。

如前所述,使用以下命令在 Uvicorn 服务器上启动应用程序 −

uvicorn main:app –reload

--reload 选项启用调试模式,这样 app.py 中的任何更改都会自动反映出来,客户端浏览器上的显示也会自动刷新。 此外,还可以使用以下命令行选项 

Sr.No命令描述
1--host ***将套接字绑定到这个主机。 [默认 127.0.0.1]
2--port ***将套接字绑定到这个端口。 [默认 8000]
3--uds ***绑定到 UNIX 域套接字。
4--fd ***从此文件描述符绑定到套接字。
5--reload启用自动重新加载。
6--reload-dir PATH明确设置重新加载目录,默认当前工作目录。
7--reload-include TEXT在查看时包括文件。默认包含 *.py
8--reload-exclude TEXT在查看文件时排除。
9--reload-delay FLOAT上次检查和下一次检查之间的延迟默认 0.25。
10--loop [auto|asyncio|uvloop]事件循环实现。 [默认 auto]
11--http [auto|h11|httptools]HTTP 协议实现。 [默认 auto]
12--interface [auto|asgi|wsgi]选择应用程序界面。[默认 auto]
13--env-file PATH环境配置文件。
14--log-config PATH日志配置文件。支持的格式 .ini.json.yaml
15--version显示 uvicorn 版本并退出。
16--app-dir TEXT在指定目录下查找 APP,默认当前目录。
17--help显示此消息并退出

除了从命令行启动 Uvicorn 服务器,它也可以通过编程方式启动。

在 Python 代码中,使用上面列出的任何参数调用 uvicorn.run() 方法 

import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():return {"message": "Hello World"}
if __name__ == "__main__":uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)

直接运行即可

6. FastAPI--路径参数

Relational State Transfer (REST) 是一种软件架构风格。 REST 定义了 Web 应用程序架构的行为方式。 它是一种基于资源的架构,其中 REST 服务器托管的所有内容(文件、图像或数据库表中的行)都是一种资源,具有多种表示形式。

约束名称描述
​统一接口​所有资源通过标准化接口(如 HTTP 方法)访问,确保一致性。
​无状态性​服务器不保存客户端状态,每个请求必须包含所有必要信息。
​客户端-服务器​职责分离:客户端处理用户交互,服务器管理数据和业务逻辑。
​可缓存性​响应应明确标识是否可缓存,以提高性能。
​分层系统​系统可分层(如代理、负载均衡),客户端无需了解中间层细节。
​按需代码​服务器可临时扩展客户端功能(如返回 JavaScript 代码)。
HTTP 方法操作描述
POSTCREATE创建新资源。
GETREAD获取资源数据。
PUTUPDATE更新现有资源(全量替换)。
DELETEDELETE删除指定资源。

现代 Web 框架使用路由或端点作为 URL 的一部分,而不是基于文件的 URL。 这有助于用户更有效地记住应用程序 URL。 在 FastAPI 中,它被称为路径。 路径或路由是 URL 中第一个"/"之后的部分。

例如,在下面的 URL 中,

http://localhost:8000/hello/TutorialsPoint

路径或路由是

/hello/TutorialsPoint

在 FastAPI 中,这样的路径字符串作为参数提供给操作装饰器。 这里的操作是指浏览器用来发送数据的HTTP动词。 这些操作包括 GET、PUT 等。操作装饰器(例如,@app.get("/"))后面紧跟一个函数,该函数在访问指定的 URL 时执行。

from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():return {"message": "Hello World"}

这里,("/") 是路径,get 是操作,@app.get("/") 是路径操作装饰器,其正下方的index() 函数称为路径操作函数。

序号方法描述典型用途
1GET请求指定资源,数据以未加密形式附加在 URL 中发送。最常用的方法。获取页面、查询数据、读取资源。
2HEAD与 GET 相同,但服务器不返回响应体(仅返回头信息)。检查资源是否存在或验证头信息。
3POST向服务器提交数据(如 HTML 表单),数据不会被缓存。创建资源、提交表单、触发操作。
4PUT将上传的内容替换目标资源的当前表示(全量更新)。更新整个资源(如文件上传)。
5DELETE删除指定资源的所有当前表示。删除资源。

URL 的端点或路径可以有一个或多个可变参数。 可以使用 Python 的字符串格式化符号来接受它们。 在上面的示例 URL http://localhost:8000/hello/TutorialsPoint 中,最后一个值可能会在每个客户端请求中发生变化。 该可变参数可以在路径中定义的变量中接受,并传递给绑定到操作装饰器的函数中定义的形式参数。

举个例子:

在路由中添加另一个带有变量参数的路径装饰器,并绑定 hello() 函数以具有 name 参数。 按照以下内容修改 main.py。

import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():return {"message": "Hello World"}
@app.get("/hello/{name}")
async def hello(name):return {"name": name}

启动 Uvicorn 服务器并访问 http://localhost:8000/hello/Tutorialspoint URL。 浏览器显示以下 JSON 响应。

{"name":"Tutorialspoint"}

将变量路径参数更改为其他内容,例如 http://localhost:8000/hello/Python,以便浏览器显示 −

{"name":"Python"}

一个路由可以有多个参数,用"/"符号分隔。

from fastapi import FastAPI
app = FastAPI()
@app.get("/hello/{name}/{age}")
async def hello(name,age):return {"name": name, "age":age}

在这种情况下,/hello 是路由,后跟两个放在大括号中的参数。 如果浏览器地址栏中给出的URL是http://localhost:8000/hello/Ravi/20,那么Ravi和20的数据将分别赋值给变量name和age。 浏览器显示以下 JSON 响应 −

{"name":"Ravi","age":"20"}

7.FastAPI--查询参数

请求数据传递到服务器的经典方法是将查询字符串附加到 URL。

假设服务器上的 Python 脚本 (hello.py) 作为 CGI 执行,由 & (与符号)连接的键值对列表构成查询字符串,该字符串附加到 URL 通过放置问号 (?) 作为分隔符

例如:http://localhost:8000/hello?name=Ravi&age=20

from fastapi import FastAPI
app = FastAPI()
@app.get("/hello")
async def hello(name:str,age:int):return {"name": name, "age":age}

查询字符串是由 & 符号连接的 parameter=value 对列表。 FastAPI 自动将端点中不是路径参数的部分视为查询字符串,并将其解析为参数及其值。 这些参数被传递给操作装饰器下面的函数。

8.FastAPI--参数验证

可以将验证条件应用于路径参数以及 URL 的查询参数。 为了在路径参数上应用验证条件,您需要导入 Path 类。 除了参数的默认值外,对于字符串参数,您还可以指定最大和最小长度。

from fastapi import FastAPI, Path
app = FastAPI()
@app.get("/hello/{name}")
async def hello(name:str=Path(...,min_length=3,
max_length=10)):return {"name": name}

 如果浏览器的URL中包含长度小于3或大于10的参数(http://localhost:8000/hello/Tutorialspoint),则会出现相应的错误信息

{"detail": [{"loc": ["path","name"],"msg": "ensure this value has at most 10 characters","type": "value_error.any_str.max_length","ctx": {"limit_value": 10}}]
}

验证规则也可以应用于数字参数,使用下面给出的运算符 

  • gt − 大于

  • ge − 大于等于

  • lt − 小于

  • le − 小于等于

查询参数也可以应用验证规则。 您必须将它们指定为 Query 类构造函数的参数的一部分。

让我们在上面的函数中添加一个名为 percent 的查询参数,并将验证规则应用为 ge=0(即大于等于 0)和 lt=100(小于等于100)

from fastapi import FastAPI, Path, Query
#path是路径参数,query是查询参数
import uvicornapp = FastAPI()@app.get("/hello/{name}/{age}")
async def hello(*,name: str=Path(...,min_length=3 ,max_length=10),age: int = Path(..., ge=1, le=100),percent:float=Query(..., ge=0, le=100)):return {"name": name, "age":age}if __name__ == '__main__':uvicorn.run(app='__main__:app', host='127.0.0.1', port=8000, reload=True)

虽然客户端可以使用 GET 方法向 API 服务器发送路径和查询参数,但我们需要应用 POST 方法将一些二进制数据作为 HTTP 请求的一部分发送。 此二进制数据可以是任何 Python 类的对象形式。 它构成请求主体。 为此,FastAPI 使用 Pydantic 库。 

9.FastAPI--Pydantic 库

Pydantic 是一个用于数据解析和验证的 Python 库。  Pydantic 定义了 BaseModel 类。 它充当创建用户定义模型的基类。

from typing import List
from pydantic import BaseModel
class Student(BaseModel):id: intname :strsubjects: List[str] = []data = {'id': 1,'name': 'Ravikumar','subjects': ["Eng", "Maths", "Sci"],
}student = Student(**data)
print(student)

Student 类的属性是用类型提示声明的。 请注意,subjects 属性是在 typing 模块中定义的列表类型和内置列表类型。

Pydantic 将尽可能自动转换数据类型。 例如,即使字典中的 id 键被分配了一个数字的字符串表示(例如'123'),它也会将其强制转换为一个整数。 但是,只要不可转换,就会引发异常。

Pydantic 还包含一个 Field 类来声明模型属性的元数据和验证规则。 首先修改 Student 类以在"name"属性上应用 Field 类型,如下所示 

from typing import List
from pydantic import BaseModel, Field
class Student(BaseModel):id: intname :str = Field(None,title="The description of the item",max_length=10)subjects: List[str] = []data = {'id': 1,'name': 'Ravikuma1111r','subjects': ["Eng", "Maths", "Sci"],
}student = Student(**data)
print(student)

 此处的名称超出了规定的max_length。 Pydantic 按预期抛出 ValidationError

10.FastAPI--Request 请求主体

我们现在将使用 Pydantic 模型对象作为客户端请求的请求体。 如前所述,我们需要使用 POST 操作装饰器

import uvicorn
from fastapi import FastAPI
from typing import List
from pydantic import BaseModel, Field
app = FastAPI()
class Student(BaseModel):id: intname :str = Field(None, title="name of student", max_length=10)subjects: List[str] = []
@app.post("/students/")
async def student_data(s1: Student):return s1

虽然 Pydantic 模型会自动填充请求主体,但也可以使用奇异值为其添加属性。 为此,我们需要使用 Body 类对象作为要装饰的操作函数的参数。

首先,我们需要从 fastapi 导入 Body 类。 如以下示例所示,在 @app.post() 装饰器下方的 student_data() 函数定义中将 'name' 和 'marks' 声明为 Body 参数。

import uvicorn
from fastapi import FastAPI
from typing import List
from pydantic import BaseModel, Field
from fastapi import Body
app = FastAPI()
class Student(BaseModel):id: intname :str = Field(None, title="name of student", max_length=10)subjects: List[str] = []
@app.post("/students/")
async def student_data(name:str=Body(...),marks:int=Body(...)):return {"name":name,"marks": marks}if __name__ == "__main__":uvicorn.run(app='__main__:app', host='127.0.0.1', port=8000, reload=True)

也可以将操作函数声明为具有路径和/或查询参数以及请求正文。 让我们修改 student_data() 函数,将路径参数"college"、"age"作为查询参数,将 Student 模型对象作为主体参数。

import uvicorn
from fastapi import FastAPI
from typing import List
from pydantic import BaseModel, Field
from fastapi import Body
app = FastAPI()
class Student(BaseModel):id: intname :str = Field(None, title="name of student", max_length=10)subjects: List[str] = []
@app.post("/students/{college}")
async def student_data(college:str, age:int, student:Student):retval={"college":college, "age":age, **student.dict()}return retvalif __name__ == "__main__":uvicorn.run(app='__main__:app', host='127.0.0.1', port=8000, reload=True)

可以看出,college是路径参数,age是查询参数,Student模型是请求主体。

特性GET 请求POST 请求
​用途​获取数据(查询)提交数据(创建/修改)
​数据位置​URL 中(查询参数)请求体(Body)中
​数据可见性​明文显示在 URL 中隐藏在请求体中,不可见
​安全性​较低(适合非敏感数据)较高(适合密码、文件等敏感数据)
​数据长度限制​受 URL 长度限制(约 2048 字符)无限制(适合大文件或长文本)

 

相关文章:

  • 精益数据分析(80/126):病毒式传播系数实战计算与增长策略优化
  • 【八股战神篇】RabbitMQ高频面试题
  • 动态规划经典三题_完全平方数
  • Pysnmp使用指南
  • 持续更新 ,GPT-4o 风格提示词案例大全!附使用方式
  • leetcode513.找树左下角的值:递归深度优先搜索中的最左节点追踪之道
  • AWS EC2实例安全远程访问最佳实践
  • FreeGPT+内网穿透外网远程连接使用,搞定ChatGPT访问难题!
  • 跟Gemini学做PPT:汇报背景图寻找指南
  • React+MapBox GL JS引入URL服务地址实现自定义图标标记地点、区域绘制功能
  • react+Mapbox GL实现标记地点、区域的功能
  • PostGIS实现栅格数据导出TIFF应用实践【ST_AsTiff】
  • RK3399 Android13设备插拔无线鼠标键盘设备出现APP或系统界面刷新现象
  • RISC-V 开发板 MUSE Pi Pro OpenCV结合Gstreamer实时显示CSI摄像头
  • 从负债到上岸:湖北理元理律师事务所的专业债务规划之道
  • 开源工具自建AI大模型底座:打造你的专属智能助理
  • 数据分析概述and环境配置
  • 驱动开发学习20250523
  • Unity 打包程序全屏置顶无边框
  • Docker端口映射与容器互联
  • html欧美网站模板/最近军事新闻热点大事件
  • 巴中网站建设天仁云/昆明seo优化
  • 黄骗免费网站/买链接网站
  • 排名好的徐州网站建设/新闻软文发布平台
  • 最佳外贸建站平台/网络推广好做吗多少钱
  • 罗湖做网站运营乐云seo/集客营销软件官方网站