创新实训2024.05.25日志:Web应用技术选型

我们的web应用使用python web的fastapi框架,通过uvicorn开启web服务。

1. refs

官网文档:FastAPI (tiangolo.com)

github:https://github.com/tiangolo/fastapi

2. 环境配置

python:3.11+

uvicorn:0.29.0

pip install "uvicorn[standard]"

什么是uvicorn?

Uvicorn 是一个轻量级的 ASGI(Asynchronous Server Gateway Interface)服务器,用于运行 Python 的 ASGI 应用。ASGI 是一个标准接口,用于异步Web应用程序和服务器之间的通信,它允许你编写异步代码,从而提高应用程序的性能和可伸缩性。

Uvicorn 的主要特点包括:

  1. 异步支持:Uvicorn 完全支持异步,这意味着它可以处理大量的并发连接,而不会阻塞服务器。
  2. 性能:Uvicorn 提供了高性能的服务器能力,特别是在与异步框架(如 FastAPI 或 Starlette)结合使用时。
  3. 简单易用:Uvicorn 的使用非常简单,可以通过命令行启动,也可以作为库在代码中启动。
  4. 跨平台:Uvicorn 可以在多种操作系统上运行,包括 Windows、macOS 和 Linux。
  5. 可扩展性:Uvicorn 可以轻松扩展以适应不同的工作负载,适用于从小规模到大规模的生产环境。
  6. 内置支持:许多现代 Python Web 框架,如 FastAPI 和 Starlette,已经内置了对 Uvicorn 的支持。
  7. 命令行接口:Uvicorn 提供了一个命令行接口(CLI),允许你快速启动和管理 ASGI 应用。
  8. WebSockets 支持:Uvicorn 支持 WebSockets,使得实时通信和交互式应用的构建成为可能。
  9. Gunicorn 集成:Uvicorn 可以与 Gunicorn(一个 Python WSGI HTTP 服务器)集成,通过 Gunicorn 运行 Uvicorn 工作器。

FastAPI的官网介绍自己说是性能最好的Python Web框架之一,主要原因就是web端的UvicornStarlette的功劳。

fastapi:0.111.0

pip install fastapi

可以看到fastapi是依赖于uvicorn做服务器的,所以务必下载这个依赖。

3. Start Off

3.1. 一个最简单的例子

启动服务

先来一个最简单的示例:

# file:main.py
from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def root():return {"message": "Hello World"}@app.get("/hello/{name}")
async def say_hello(name: str):return {"message": f"Hello {name}"}

随后利用命令:

uvicorn main:app --reload

进行启动

uvicorn main:app 命令含义如下:

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

随后可以请求下我们创建的两个接口:

可以看到服务端的所有请求:

同时,可以创建一个.http文件,进行接口测试:

接口文档

跳转到 http://127.0.0.1:8000/docs。

你将会看到自动生成的交互式 API 文档(由 Swagger UI 提供)

以及由 ReDoc提供的可选的文档

OpenAPI规范

FastAPI 使用定义 API 的 OpenAPI 标准将你的所有 API 转换成一种模式描述,或者说是API的规范。

访问127.0.0.1:8000/openapi.json可以看到这个json文档。

3.2. 开放一个新的接口

路径类型

这个在上面的实例中已经有所体现:

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

这里的请求路径方式有很多,包括:

@app.post()
@app.put()
@app.delete()
@app.options()
@app.head()
@app.patch()
@app.trace()

虽然在语义上有所不同,但前三个(post,put,delete)的实际行为是可以任意规定的。比如本来该delete的行为,用post来传递参数,其实也无所谓。

另外我们可以用async关键字来规定某个接口的行为是否是异步的,对于那些不需要等待其他子程序的请求,我们可以允许这样的异步行为,利用await关键字告知python在这段程序执行时你可以转而执行其他子程序,等到这段程序执行完毕再返回执行。

路径参数

参数声明+参数类型

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

本例把 item_id 的类型声明为 int

同时会对这个参数进行校验,如果你传个没法转成int类型的数据,(比如food,4.2这种)将报错:

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

此外,这个类型可以是枚举类型:路径操作使用 Python 的 Enum 类型接收预设的路径参数

导入 Enum 并创建继承自 str 和 Enum 的子类。

通过从 str 继承,API 文档就能把值的类型定义为字符串,并且能正确渲染。

然后,创建包含固定值的类属性,这些固定值是可用的有效值:

from enum import Enumfrom 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"}

最后,这个参数本身可能也是个路径,例如/home/myfile.txt这种,此时要用到路径转换器:

from fastapi import FastAPIapp = FastAPI()@app.get("/files/{file_path:path}")
async def read_file(file_path: str):return {"file_path": file_path}

本例中,参数名为 file_path,结尾部分的 :path 说明该参数应匹配路径

查询参数

在?后,用&分割

例如:

from fastapi import FastAPIapp = FastAPI()fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):return fake_items_db[skip : skip + limit]

利用该接口请求:

<http://127.0.0.1:8000/items/?skip=0&limit=10>

如果不指定这两个参数,那么将是默认值

请求体

这里有一个很关键的组件,叫做pydantic,是python生态圈里很有名的做数据校验的组件:Welcome to Pydantic - Pydantic

首先我们需要利用pydantic提供的basemodel来定义一个合法的请求体是什么样子的:

from fastapi import FastAPI
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Noneapp = FastAPI()@app.post("/items/")
async def create_item(item: Item):return item

其中description和tax是有默认值的,可以不给他们传参,但是没有默认值得必须传参了。

from fastapi import FastAPI
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Noneapp = FastAPI()@app.post("/items/")
async def create_item(item: Item):return item

此处,请求体参数的类型为 Item 模型。 甚至请求体和路径参数是可以共存的:

from fastapi import FastAPI
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Noneapp = FastAPI()@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):return {"item_id": item_id, **item.dict()}

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

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

相关文章

老外卖27刀每月的教程已经更新

用了两天半的时间&#xff0c;边学习&#xff0c;边整理了一份老外的视频教程&#xff0c;涉及Facebook&#xff0c;YouTube&#xff0c;tiktok等大的流量平台&#xff0c;有案例&#xff0c;有分析&#xff0c;有如何做。 这个教程是老外讲的&#xff0c;没有什么玄乎的塑造价…

聊聊ChatGPT的本质

这是鼎叔的第九十八篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 阶段性总结下我对ChatGPT的基础理解&#xff0c;算是一篇学习思考笔记吧。其中难免有很多不准确的&#xff0c;或过于简略的地方&#xff0c;将来再迭代学习。 OpenAI做ChatGPT的底层逻辑…

如何利用线程池实现互联网验证码保护服务

如何利用线程池实现互联网验证码保护服务 1、业务背景与实现思路2、代码实操1、业务背景与实现思路 首先介绍一下业务背景,假设我们的系统是一个短视频播放网站,每个新加入的用户都需要注册账号并绑定手机号。为了验证用户手机的正确性,我们的系统会发送一条验证码到用户注…

K8s的kubectl的基本操作

K8s的kubectl的基本操作 K8s基本信息的查看 查看版本信息 kubectl versio查看资源对象简写 kubectl api-resources查看集群信息 kubectl cluster-info配置kubectl自动补全 source <(kubectl completion bash)查看master节点状态 kubectl get cs查看命名空间 kubectl…

【找出第 K 大的异或坐标值】python

4层循环暴力超时 class Solution:def kthLargestValue(self, matrix: List[List[int]], k: int) -> int:nums[]for a in range(len(matrix)):for b in range(len(matrix[0])):num0for i in range(a1):for j in range(b1):num^matrix[i][j]nums.append(num)nums.sort()retu…

类的内存对齐位段位图布隆过滤器哈希切割一致性哈希

文章目录 一、类的内存对齐1.1规则1.2原因 二、位段2.1介绍2.2内存分配问题2.3跨平台问题2.4使用的注意事项 三、位图的应用3.1 给40亿个不重复的无符号整数&#xff0c;找给定的一个数。&#xff08;int的范围可以到达42亿多&#xff09;3.2 给定100亿个整数&#xff0c;设计算…

Golang实现文件复制

方法&#xff1a;三种 package zdpgo_fileimport ("errors""io""os" )// CopyFile 使用io.Copy进行文件的复制&#xff0c;同时也会复制文件的所有权限 // param src 复制文件 // param des 目标文件 // return error 错误信息 func CopyFile(s…

2024年弘连网络FIC大会竞赛题线下决赛题

总结&#xff1a; FIC决赛的时候&#xff0c;很多小问题没发现&#xff0c;在pve平台做题确实很方便。 这套题目复盘完&#xff0c;服务器这块的知识确实收获了很多&#xff0c;对pve集群平台和网络拓扑也有了一定的认识&#xff0c;感谢各位大佬悉心指导。 接下来&#xff0…

【FPGA】Verilog:奇校验位生成器的实现(Odd Parity bit generator)

解释奇数奇偶校验位生成器和检查器的仿真结果及过程。 真值表和卡洛图: Odd Parity Bit Generator A B C

怎么在pyqt中显示matplotlib的绘图?

想要在pyqt中显示matplotlib的绘图&#xff0c;在绘图时&#xff0c;其实不必使用以下语句&#xff1a; matplotlib.use("Qt5Agg") # 声明使用QT5最关键的语句是&#xff1a; from matplotlib.backends.backend_qt5agg import FigureCanvasQTAggFigureCanvasQTAgg…

学 Python 具体能干什么?

Python 是一种功能强大、用途广泛的编程语言&#xff0c;因其简洁易读的语法和丰富的库生态系统而备受欢迎。学习 Python后&#xff0c;你可以从事以下几方面的工作&#xff1a; 1. Web 开发 Python 有很多流行的 Web 框架&#xff0c;如&#xff1a; Django&#xff1a;一个…

Android studio的Gradle出问题

Gradle sync failed: Plugin [id: com.android.application, version: 7.1.1, apply: false] was not found in any of the following sources: 在src里面的build.gradle中 plugins { id ‘com.android.application’ } 的上面加上 buildscript {repositories {jcenter()}depen…

从 0 开始实现一个网页聊天室 (小型项目)

实现功能 用户注册和登录好友列表展示会话列表展示: 显示当前正在进行哪些会话 (单聊 / 群聊) , 选中好友列表中的某个好友, 会生成对应的会话实时通信, A给B发送消息, B的聊天界面 / 会话界面能立刻显示新的消息 TODO: 添加好友功能用户头像显示传输图片 / 表情包历史消息搜…

禅道密码正确但是登录异常处理

禅道密码正确&#xff0c;但是登录提示密码错误的异常处理 排查内容 # 1、服务器异常&#xff0c;存储空间、数据库异常 # 2、服务异常&#xff0c;文件丢失等异常问题定位 # 1、df -h 排查服务器存储空间 # 2、根据my.php排查数据库连接是否正常 # 3、修改my.pho,debugtrue…

探索切片索引:列表反转的艺术

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;列表反转的挑战 二、切片索引的基本概念 三、切片索引实现列表反转 …

vs2013使用qt Linguist以及tr不生效问题

一、qt Linguist&#xff08;语言家&#xff09;步骤流程 1、创建翻译文件,在qt选项中 2.选择对应所需的语言&#xff0c;得到.ts后缀的翻译文件 3.创建.pro文件&#xff0c;并将.ts配置在.pro文件中 3.使用qt Linguist 打开创建好的以.ts为后缀的翻译文件&#xff0c;按图所示…

细粒度图像分类论文(AAM模型方法)阅读笔记

细粒度图像分类论文阅读笔记 摘要Abstract1. 用于细粒度图像分类的聚合注意力模块1.1 文献摘要1.2 研究背景1.3 本文创新点1.4 计算机视觉中的注意力机制1.5 模型方法1.5.1 聚合注意力模块1.5.2 通道注意力模块通道注意力代码实现 1.5.3 空间注意力模块空间注意力代码实现 1.5.…

【软件设计师】面向对象技术

1.面向对象基础 1.1 基本概念 方法重载是函数名字相同&#xff0c;参数列表不同 组成 即组合&#xff0c;指整体与部分的关系&#xff0c;整体与部分生命周期相同 聚合 关联关系的一个特例&#xff0c;是体现整体与部分&#xff0c;即使has-a的关系&#xff0c;此时整体与部分…

【LakeHouse】Apache Iceberg + Amoro 助力网易构建云原生湖仓

Apache Iceberg Amoro 助力网易构建云原生湖仓 1.云原生湖仓背景与挑战2.Apache Iceberg 、Amoro 与云原生2.1 Apache Iceberg2.2 Amoro 简介 3.Apache Iceberg Amoro 云原生实践3.1 云上湖仓案例一3.2 云上湖仓案例二3.3 云上湖仓案例三 4.Amoro 未来发展规划 出品社区&…

【代码随想录——回溯算法二周目】

1. 组合总和 var (path []intres [][]int )func combinationSum(candidates []int, target int) [][]int {path make([]int, 0)res make([][]int, 0)dfs(candidates,target,0,0)return res }func dfs(candidates []int, target int,tempTarget int,start int) {if tempTarg…