FastApi+WebSocket 解析

FastAPI 比较简单,就是加一个路由装饰器就可以运行函数了,一般来说是结合async来进行异步编程,同时结合websocket来使用。

目录

  • 特点
  • 运行
  • Websocket
  • 进阶

特点

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,特别适合于构建微服务。它基于标准 Python 类型提示,这使得它的一大特点是自动数据验证和自动生成 API 文档(包括 Swagger 和 ReDoc)。FastAPI 支持异步编程,允许开发者利用异步和等待关键字来编写非阻塞代码,从而提高性能。它的设计简洁且易于扩展,在开发高性能应用程序时特别有用。FastAPI 没有提供自带的数据库系统或前端组件,它专注于 API 的快速开发和运行效率。

运行

安装:


安装 
pip install fastapi
安装部署包
pip install uvicorn

main.py:

from fastapi import FastAPI

app = FastAPI()
# 用来创建一个 FastAPI 应用的实例。这个实例作为你构建 API 的基础,
#会通过它来定义路由、中间件、事件处理器等。
#每个 FastAPI 应用都需要至少一个这样的实例,以便启动和运行服务。这是设置你的 API 服务器的起点,后续的所有操作(如添加路由、请求处理函数等)都将基于这个实例进行配置。


@app.get("/")
def read_root():
    return {"Hello": "World"}

运行命令:

uvicorn main:app --host 0.0.0.0 --port 8000 --reload
main: 表示app所在文件名
app:FastAPI实例
reload:debug模式,可以自动重启

访问查看API 文档

交互文档
http://127.0.0.1:8000/docs
http://127.0.0.1:8000/redoc
返回接口文档

路径装饰器:

@app.get("/")
'''
@app.get("/") 告诉 FastAPI 在它下方的函数负责处理如下访问请求:

请求路径为 /
使用 get 操作
你也可以使用其他的操作:
    @app.post()
    @app.put()
    @app.delete()
    以及更少见的:
    @app.options()
    @app.head()
    @app.patch()
    @app.trace()
这些对应都是请求方式 '''

将特定的函数绑定到对根 URL(“/”)的 HTTP GET 请求。这意味着当 FastAPI 应用接收到一个指向根 URL 的 GET 请求时,它会执行这个装饰器下方定义的函数。

@app.get("/print")
def print_demo():
    print('Hello')
    return {"Hello"}
# 此时输入的时候就会在控制台输出Hello
# web页面显示["Hello"]

函数执行并达到 return 语句时,函数返回的值会被 FastAPI 自动处理,并转换为 **JSON 格式(**除非指定其他格式),然后作为 HTTP 响应体发送给客户端。返回内容可以是dict,也可以是list, str、int 等都可以。

带参数

@app.get("/{name}")
def root(name):
    return {"name": name}

# 访问 /john,你会得到响应 {"name": "john"}。
# 可以匹配任何字符串,除非有其他更具体的路径匹配先发生。

Websocket

WebSocket是一种通过单个长时间连接提供全双工通信渠道的协议。它允许客户端和服务器之间发送实时消息,而不需要重新建立连接,这对于实时应用程序如在线游戏、聊天应用或实时数据传输非常有用。WebSocket连接在HTTP端口上初始化,然后通过握手升级到WebSocket协议,允许数据以帧的形式来回传输。这种机制减少了延迟,提高了通信效率,并且可以通过WebSocket API在许多编程语言中实现。
下面的接口测试可使用ApiFox 对ws进行测试

from fastapi import FastAPI, WebSocket
@app.websocket("/ws")
#浏览器或其他客户端使用如ws://127.0.0.1:8000/ws这样的WebSocket URL尝试连接服务器时,这个websocket对象就会被初始化,并且通过这个对象,服务器能够接收和发送消息,管理连接的状态等。
async def websocket_endpoint(websocket: WebSocket):
#函数接收一个WebSocket类型的参数websocket,用于处理WebSocket连接。
    await websocket.accept()
    #  服务器接受客户端的WebSocket连接请求。
    while True:
        data = await websocket.receive_text()
        #文本消息。
        if data == "bye":
        	# 发送信息
            await websocket.send_text(f"接受到的消息是: {data}")
            await websocket.send_text("聊天关闭")
            await  websocket.close(100)
        else:
            await websocket.send_text(f"接受到的消息是: {data}")

测试的接口地址:

ws://127.0.0.0:8002/ws

进阶


if config.DEBUG:
    app = FastAPI(lifespan=lifespan, debug=True)
else:
    app = FastAPI(lifespan=lifespan, docs_url=None, openapi_url=None, redoc_url=None)
# 正在关闭自动生成的文档链接。默认情况下,FastAPI 会在 /docs 和 /redoc 路径提供 Swagger 和 ReDoc 的文档界面。通过将这些参数设置为 None,可以禁用这些接口,这通常用于生产环境中,以隐藏 API 文档。
DEBUG = any(i in SERVICE_NAME for i in ["dev", "test"])
# 如果service_name存在dev和test那么默认是debug,并且为true

debug=True 主要用于API的错误处理和调试信息的输出,而 –reload 选项是指让服务器在代码改变时自动重新加载
lifespan 参数用来管理应用的生命周期事件。通过设置 lifespan,可以定义应用在启动和关闭时执行的特定函数。例如,在应用启动时,你可能需要连接数据库,而在应用关闭时,关闭这些连接。

结构化导入api:

from routers import api,, ws
app.include_router(ws.router)
app.include_router(api.router)

router = APIRouter(prefix="/ws", tags=["websocket"])
@router.websocket("/chat")
async def chat(ws: WebSocket, auth_result=Depends(websocket_authentication)):
    await ws.accept()

    current_user, error = auth_result
    if error:
        logger.warning(f"Authentication failed: {error}")
        await ws.send_json({"status": AUTHENTICATION_FAILED_40001, "message": f"Authentication failed: {error}"})
        await ws.close()
        return

    async for req in ws.iter_json():
        handler = MsgHandlerFactory.get_handler(
            ws=ws,
            token=ws.query_params.get("token"),
            current_user=current_user,
            request_data=req,
        )
        await handler.run()

顶部定义一个 APIRouter 实例,这意味着你正在创建一个特定的路由处理器。这个实例会被用来注册与 WebSocket 相关的路由。。在这个过程中,Depends(websocket_authentication) 会确保在处理任何其他逻辑之前执行 websocket_authentication 函数。这意味着每次客户端尝试通过 /chat 建立连接时,都会先进行身份验证。
如果验证成功,auth_result 将包含用户信息;如果失败,则可能包含错误信息。此设计确保只有验证通过的连接才能进一步交互。

ws身份验证:

async def websocket_authentication(ws: WebSocket):
    token = ws.query_params.get("token")
    service = ws.query_params.get("service", "XXXXX")
    set_request_id(str(uuid4()))
    authorizer = {
        "XXXXX": XXXX_core_sdk,
    }.get(service)

    if not authorizer:
        return {}, "unsupported service"
    if not token:
        return {}, "token not found"

    current_user = await authorizer.check_auth(token)
    if not current_user:
        return {}, "invalid token"
    return current_user, None

ws url 参数说明:
ws.query_params.get(“token”) 表示代码正在尝试从 WebSocket 连接的查询参数中获取 token。这意味着 token 作为 URL 的一部分传递,类似于 ws://example.com/chat?token=yourtokenhere。

WebSocket API中,常用的方法包括

send_text(data): 发送文本数据到WebSocket服务器。
receive_text(): 接收来自WebSocket服务器的文本数据。
send_bytes(data): 发送二进制数据到WebSocket服务器。
receive_bytes(): 接收来自WebSocket服务器的二进制数据。
send_json(data): 发送JSON格式的数据到WebSocket服务器。这是一个便捷方法,它自动将Python字典或列表序列化为JSON字符串。
receive_json(): 接收JSON格式的数据,并将其反序列化为Python对象。
close(code=1000, reason=‘’): 关闭WebSocket连接,可以指定关闭代码和原因
这些方法通常用于在客户端和服务器之间进行双向实时通信。使用时需要注意适当处理连接状态,确保在连接开启后发送和接收数据,以及在结束通信时关闭连接。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一招解决找不到d3dcompiler43.dll,无法继续执行代码问题

当您的电脑遇到d3dcompiler43.dll缺失问题时,首先需要了解d3dcompiler43.dll文件及其可能导致问题的原因,之后便可以选择合适的解决方案。在此,我们将会为您提供寻找d3dcompiler43.dll文件的多种处理方法。 一、d3dcompiler43.dll文件分析 d…

【C++第十课 - stack_queue】stack、queue的使用、适配器模型stack、queue和priority_queue的底层实现、deque

目录 一、stack使用1、push2、pop3、empty4、top题目1、最小栈2、栈的压入、弹出序3、逆波兰表达式求值 二、queue的使用priority_queue习题 三、适配器stack的底层实现queue的底层实现priority_queue的底层实现仿函数/函数对象函数指针 四、deque 一、stack使用 stack是个容器…

【74LS163做24进制计数器】2021-11-19

缘由用74LS163做24进制计数器-其他-CSDN问答,仿真multisim两个74LS163芯片如何构成47进制计数器-吐槽问答-CSDN问答 参考74ls163中文资料汇总(74ls163引脚图及功能_内部结构图及应用电路) - 电子发烧友网

1.pwn的汇编基础(提及第一个溢出:整数溢出)

汇编掌握程度 能看懂就行,绝大多数情况不需要真正的编程(shellcode题除外) 其实有时候也不需要读汇编,ida F5 通常都是分析gadget,知道怎么用, 调试程序也不需要分析每一条汇编指令,单步执行然后查看寄存器状态即可 但…

【Python机器学习】模型评估与改进——多分类指标

多分类问题的所有指标基本是上都来自于二分类问题,但是要对所有类别进行平均。多分类的精度被定义为正确分类的样本所占的比例。同样,如果类别是不平衡的,精度并不是很好的评估度量。 想象一个三分类问题,其中85%的数据点属于类别…

Java(七)——多态

个人简介 👀个人主页: 前端杂货铺 ⚡开源项目: rich-vue3 (基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL) 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 &#x1…

Go语言如何入门,有哪些书推荐?

Go 语言之所以如此受欢迎,其编译器功不可没。Go 语言的发展也得益于其编译速度够快。 对开发者来说,更快的编译速度意味着更短的反馈周期。大型的 Go 应用程序总是能在几秒钟之 内完成编译。而当使用 go run编译和执行小型的 Go 应用程序时,其…

VMware虚拟机搭建CentOS7环境

相关资料 安装VMware 双击VMware-workstation(16.1.1软件安装包.exe安装文件,点下一步 激活码文件复制激活码激活安装linux 1、点击创建虚拟机

Open3D 删除点云中重叠的点(方法一)

目录 一、概述 二、代码实现 三、实现效果 3.1原始点云 3.2处理后的点云 3.3计算结果 一、概述 在点云处理中,重叠点(即重复点)可能会对数据分析和处理的结果产生负面影响。因此,删除重叠点是点云预处理中常见且重要的步骤。…

【网络安全】实验一(网络拓扑环境的搭建)

一、本次实验的实验目的 学习利用 VMware 创建虚拟环境 学习利用 VMware 搭建各自网络拓扑环境 二、创建虚拟机 三、克隆虚拟机 选择克隆的系统必须处于关机状态。 方法一: 方法二: 需要修改克隆计算机的名字,避免产生冲突。 四、按照要求完…

机器学习原理之 -- 神经网络:由来及原理详解

神经网络(Neural Networks)是受生物神经系统启发而设计的一类计算模型,广泛应用于图像识别、语音识别、自然语言处理等领域。其基本思想是通过模拟人脑神经元的工作方式,实现对复杂数据的自动处理和分类。本文将详细介绍神经网络的…

Scrapy框架的基本使用教程

1、创建scrapy项目 首先在自己的跟目录文件下执行命令: PS D:\BCprogram\python_pro\bigdata> scrapy startproject theridion_grallatorscrapy startproject 项目名 具体执行操作如下:1、创建项目目录:Scrapy会在当前工作目录下创建一…

【python中级】图像从从笛卡尔坐标系转换为极坐标系

【python中级】图像从从笛卡尔坐标系转换为极坐标系 1.背景2.生成二维图3.极坐标转换1.背景 笛卡尔坐标系就是我们常说的直角坐标系。 笛卡尔坐标系,也称为直角坐标系,是由法国数学家和哲学家勒内笛卡尔(Ren Descartes)发明的一种二维或三维坐标系统。它使用两个或三个相互…

【Qt】Qt开发环境搭建

目录 一. Qt SDK的下载&安装 二. Qt相关工具介绍 Qt的常用开发工具有: Qt CreatorVisual StudioEclipse 一. Qt SDK的下载&安装 Qt 下载官网: http://download.qt.io/archive/qt/ 国内清华源: https://mirrors.tuna.tsinghua.edu.cn/qt/arc…

C# WinForm —— 37 TabControl 控件介绍

1. 简介 管理一个TabPages集合的控件,也是一个分组控件 如果一个模块有多个子页面,可以使用TabControl控件进行页面切换 2. 属性 属性解释(Name)控件ID,在代码里引用的时候会用到Enabled控件是否启用Alignment确定选项卡是否显示在控件的…

扩散模型笔记2

Ref:扩散模型的原理及实现(Pytorch) 在扩散模型中,每一步添加的噪声并不是完全一样的。具体来说,噪声的添加方式和量在每一步是根据特定的规则或公式变化的。这里我们详细解释每一步添加噪声的过程。 正向过程中的噪声添加&…

两种转5V的DCDC电路:

最大电流:5A 最大电流:3A 验证通过:RT8289GSP性能更佳,带载能力更强:

前端JS特效第22波:jQuery滑动手风琴内容切换特效

jQuery滑动手风琴内容切换特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xm…

Guitar Pro8.2让你的吉他弹奏如虎添翼!

亲爱的音乐爱好者们&#xff0c;今天我要跟大家安利一个让我彻底沉迷其中的神器——Guitar Pro8.2&#xff01;这可不是一般的软件&#xff0c;它简直是吉他手们的福音。不管你是初学者还是老鸟&#xff0c;这个打谱软件都能给你带来前所未有的便利和价值。 让我们来聊聊Guita…

昇思25天学习打卡营第9天|ResNet50图像分类

一、Resnet残差网络模型 构建残差网络结构;Building BlockBottleneck 残差结构由两个分支构成&#xff1a;一个主分支 &#x1d439;(&#x1d465;)&#xff0c;一个shortcuts&#xff08;图中弧线表示,&#x1d465;&#xff09;。 得到残差网络结构:&#x1d439;(&#x…