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

2024-05-26 20:52

本文主要是介绍创新实训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()}

这篇关于创新实训2024.05.25日志:Web应用技术选型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005561

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

SpringShell命令行之交互式Shell应用开发方式

《SpringShell命令行之交互式Shell应用开发方式》本文将深入探讨SpringShell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F