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

news2024/12/23 21:20:31

我们的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 FastAPI

app = 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 Enum

from fastapi import FastAPI

class 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 FastAPI

app = 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 FastAPI

app = 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 BaseModel

class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    return item

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

from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    return item

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

from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None

app = FastAPI()

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    return {"item_id": item_id, **item.dict()}

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

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

相关文章

【启程Golang之旅】基本变量与类型讲解

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

嵌入式全栈开发学习笔记---C语言笔试复习大全25(实现学生管理系统)

目录 实现学生管理系统 第一步&#xff1a;结构体声明 第二步&#xff1a;重命名结构体 第三步&#xff1a;限定可以存储的最大学生数目 第四步&#xff1a;定义结构体指针数组和定义一个整型变量存放当前的人数 第五步&#xff1a;设计欢迎界面 第六步&#xff1a;设计…

【设计模式】JAVA Design Patterns——Command(事务模式)

&#x1f50d;目的 将请求封装为对象&#xff0c;从而使你可以将具有不同请求的客户端参数化&#xff0c;队列或记录请求&#xff0c;并且支持可撤销操作。 &#x1f50d;解释 真实世界例子 有一个巫师在地精上施放咒语。咒语在地精上一一执行。第一个咒语使地精缩小&#xff0…

从关键新闻和最新技术看AI行业发展(2024.5.6-5.19第二十三期) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky的公众号&…

C++之std::is_trivially_copyable(平凡可复制类型检测)

目录 1.C基础回顾 1.1.平凡类型 1.2.平凡可复制类型 1.3.标准布局类型 2.std::is_trivially_copyable 2.1.定义 2.2.使用 2.3.总结 1.C基础回顾 在C11中&#xff0c;平凡类型&#xff08;Trivial Type&#xff09;、平凡可复制类型&#xff08;TrivialCopyable&#x…

深入理解与防御跨站脚本攻击(XSS):从搭建实验环境到实战演练的全面教程

跨站脚本攻击&#xff08;XSS&#xff09;是一种常见的网络攻击手段&#xff0c;它允许攻击者在受害者的浏览器中执行恶意脚本。以下是一个XSS攻击的实操教程&#xff0c;包括搭建实验环境、编写测试程序代码、挖掘和攻击XSS漏洞的步骤。 搭建实验环境 1. 安装DVWA&#xff…

8.什么是HOOK

程序编译的本质是&#xff0c;首先计算机它只能看得懂机器码也就是只能看得懂数字&#xff0c;机器码学起来很费劲然后就创造了编译器这个东西&#xff0c;编译器它懂机器语言所以它可以跟机器沟通&#xff0c;而我们人可以跟编译器沟通&#xff0c;人跟编译器的语言就是各种各…

GBDT、XGBoost、LightGBM算法详解

文章目录 一、GBDT (Gradient Boosting Decision Tree) 梯度提升决策树1.1 回归树1.2 梯度提升树1.3 Shrinkage1.4 调参1.5 GBDT的适用范围1.6 优缺点 二、XGBoost (eXtreme Gradient Boosting)2.1 损失函数2.2 正则项2.3 打分函数计算2.4 分裂节点2.5 算法过程2.6 参数详解2.7…

不拍视频,不直播怎么在视频号卖货赚钱?开一个它就好了!

大家好&#xff0c;我是电商糖果 视频号这两年看着抖音卖货的热度越来越高&#xff0c;也想挤进电商圈。 于是它模仿抖音推出了自己的电商平台——视频号小店。 只要商家入驻视频号小店&#xff0c;就可以在视频号售卖商品。 具体怎么操作呢&#xff0c;需要拍视频&#xf…

leedcode【142】. 环形链表 II——Java解法

Problem: 142. 环形链表 II 思路解题方法复杂度Code性能 思路 1.用快慢指针找到相遇的点&#xff08;快指针一次走一步&#xff0c;慢指针一次走两步&#xff09; 2.一个指针从head开始&#xff0c;一个指针从相遇点开始&#xff0c;一次一步&#xff0c;相遇处即为环入口 解题…

Vmware 17安装 CentOS9

前言 1、提前下载好需要的CentOS9镜像&#xff0c;下载地址&#xff0c;这里下载的是x86_64 2、提前安装好vmware 17&#xff0c;下载地址 &#xff0c;需要登录才能下载 安装 1、创建新的虚拟机 2、在弹出的界面中选择对应的类型&#xff0c;我这里选择自定义&#xff0c;点…

P459 包装类Wrapper

包装类的分类 1&#xff09;针对八种基本数据类型相应的引用类型——包装类。 2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 Boolean包装类 Character包装类 其余六种Number类型的包装类 包装类和基本数据类型的相互转换 public class Integer01 {publi…

【大数据面试题】32 Flink 怎么重复读 Kafka?

一步一个脚印&#xff0c;一天一道面试题 首先&#xff0c;为什么要读过的 Kafka 数据重写读一次呢&#xff1f;什么场景下要怎么做呢&#xff1f; 答&#xff1a;当任务失败&#xff0c;从检查点Checkpoint 开始重启时&#xff0c;检查点的数据是之前的了&#xff0c;就需要…

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

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

CTF之Web_python_block_chain

这种题对于我来说只能看大佬的wp&#xff08;但是这一题是wp都看不懂&#xff0c;只能表达一下我的理解了&#xff09; &#xff08;最后有简单方法&#xff0c;前面一种没看懂没关系&#xff09; 下面这一部分是首页的有用部分 访问/source_code,得到源码&#xff1a; # -*-…

鸿蒙 DevEco Studio 3.1 Release 下载sdk报错的解决办法

鸿蒙 解决下载SDK报错的解决方法 最近在学习鸿蒙开发&#xff0c;以后也会记录一些关于鸿蒙相关的问题和解决方法&#xff0c;希望能帮助到大家。 总的来说一般有下面这样的报错 报错一&#xff1a; Components to install: - ArkTS 3.2.12.5 - System-image-phone 3.1.0.3…

企业客户信息反馈|基于SprinBoot+vue的企业客户信息反馈平台(源码+数据库+文档)

企业客户信息反馈平台 目录 基于SprinBootvue的企业客户信息反馈平台 一、前言 二、系统设计 三、系统功能设计 1平台功能模块 2后台登录 5.2.1管理员功能 5.2.2客户功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&am…

AIGC 005-Dreambooth定制化生成,微调文本到图像的扩散模型!

AIGC 005-Dreambooth定制化生成&#xff0c;微调文本到图像的扩散模型&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 DreamBooth 论文 (DreamBooth: Fine-Tuning Text-to-Image Diffusion Models for Subject-Driven Generation) 提出了一种新颖的技术&#x…

2024GDCPC广东省赛记录

比赛流程体验&#xff0c;依托&#xff0c;开赛几分钟了&#xff0c;选手还卡在门外无法入场&#xff0c;也没给延时&#xff0c;说好的桌上会发三支笔&#xff0c;于是我们就没准备&#xff0c;要了三次笔&#xff0c;终于在一小时后拿到了&#x1f605; 比赛题目体验&#xf…

近期阅读论文

Exploring Hybrid Active-Passive RIS-Aided MEC Systems: From the Mode-Switching Perspective abstract 移动边缘计算&#xff08;MEC&#xff09;被认为是支持延迟敏感和计算密集型服务的有前途的技术。 然而&#xff0c;随机信道衰落特性导致的低卸载率成为制约MEC性能的…