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 FastAPIapp = 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_resultif error:logger.warning(f"Authentication failed: {error}")await ws.send_json({"status": AUTHENTICATION_FAILED_40001, "message": f"Authentication failed: {error}"})await ws.close()returnasync 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.rhkb.cn/news/374393.html

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

相关文章

vue3中antd上传图片组件及回显

实现效果&#xff1a; 调用后端接口后&#xff0c;后端返回的数据&#xff1a; 1.在项目components/base下新建UploadNew.vue文件&#xff08;上传图片公共组件&#xff09; <template><div class"clearfix"><a-uploadv-model:file-list"fileL…

视频汇聚平台EasyCVR设备录像回看请求播放时间和实际时间对不上,是何原因?

安防监控EasyCVR视频汇聚平台可提供多协议&#xff08;RTSP/RTMP/国标GB28181/GAT1400/海康Ehome/大华/海康/宇视等SDK&#xff09;的设备接入、音视频采集、视频转码、处理、分发等服务&#xff0c;系统具备实时监控、云端录像、回看、告警、平台级联以及多视频流格式分发等视…

【自监督学习】DINO in ICCV 2021

一、引言 论文&#xff1a; DINO: Emerging Properties in Self-Supervised Vision Transformers 作者&#xff1a; Facebook AI Research 代码&#xff1a; DINO 特点&#xff1a; 对于一张图片&#xff0c;该方法首先进行全局和局部的裁剪与增强并分别送入教师和学生网络&am…

关于.NETCORE站点程序部署到nginx上无法访问静态文件和无法正确生成文件的问题解决过程。

我的netcore6项目&#xff0c;部署到IIS的时候&#xff0c;生成报告时&#xff0c;需要获取公司LOGO图片放到PDF报告文件中&#xff0c;这时候访问静态图片没有问题。 然后还有生成邀请二维码图片&#xff0c;这时候动态创建图片路径和图片也没有问题&#xff0c;可以在站点的…

本地部署:Real-ESRGAN: 高效的图像超分辨率解决方案

目录 引言 什么是 Real-ESRGAN Real-ESRGAN 的特点 工作原理 应用场景 本地部署 本地运行 实验与结果 未来发展方向 结语 Tip&#xff1a; 引言 图像超分辨率&#xff08;Super-Resolution, SR&#xff09;技术旨在从低分辨率图像生成高分辨率图像&#xff0c;应用…

初学SpringMVC之 RestFul 风格、重定向和转发

RestFul 风格改变 URL 形式 比如之前是&#xff1a;http://localhost:8080/add?a1&b2 现在是&#xff1a;http://localhost:8080/add/a/b&#xff08;全是斜杠&#xff09; package com.demo.controller;import org.springframework.stereotype.Controller; import org…

this.$confirm不要取消按钮以及右上角的差号

this.$confirm(保存成功! 订单号为&#xff1a;${res.data}, , {confirmButtonText: 确定,showCancelButton: false, // 不显示取消按钮showClose: false, // 不显示右上角的叉号type: success}).then(() > {}) 效果图下&#xff1a;

基于4G、5G和卫星宽带的应急通信车载聚合路由器组网方案

应急指挥车、现场应急指挥系统作为整个应急指挥平台的主要组成部分&#xff0c;被广泛用于救灾抢险,安全保障等特殊场景&#xff0c;可通过应急指挥车或现场应急指挥系统与后方指挥中心间传输音视频信息&#xff0c;实现现场与指挥中心的实时通信&#xff0c;进行视频会议和远程…

realsense D435l+mid360标定

目录 一、安装realsense环境 二、获取realsense D450L相机内参 三、标定雷达和相机 1.下载livox_camera_calib 2.修改配置参数 3.使用fastlio生成点云 4.标定 一、安装realsense环境 git clone https://github.com/IntelRealSense/librealsense.git cd librealsense //更…

Python基础教学之一:入门篇——迈入编程世界的第一步

Python基础教学之一&#xff1a;入门篇——迈入编程世界的第一步 一、Python简介&#xff1a;历史与现状 Python&#xff0c;一种解释型、高级和通用的编程语言&#xff0c;由Guido van Rossum在1989年圣诞节期间创造&#xff0c;并于1991年首次发布。设计哲学强调代码的可读性…

vb.netcad二开自学笔记9:界面之ribbon

一个成熟的软件怎么能没有ribbon呢&#xff0c;在前面的框架基础上再加个命令AddRibbon <CommandMethod("AddRibbon")> Public Sub AddRibbon() Dim ribbonControl As RibbonControl ComponentManager.Ribbon Dim tab As RibbonTab New RibbonTab() tab.Tit…

解决keil调试遇到的hardlfault问题

在程序开发过程中遇到的程序死机问题 导致死机的原因&#xff1a;内存溢出&#xff0c;堆栈溢出&#xff0c;数组越界&#xff0c;中断错误。。。。。。 出现这个问题&#xff0c;首先查看线程的调度关系 看最后是在哪个位置死机&#xff0c;如果rt_current_thread在main_thre…

【数据结构与算法 经典例题】判断两棵二叉树是否相同

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法 经典例题》C语言 期待您的关注 目录 一、问题描述 二、解题思路 三、C语言实现代码 一、问题描述 给你两棵二…

公共安全和应急管理系统:提升社区韧性与危机应对能力

引言 公共安全和应急管理是现代社会不可或缺的组成部分&#xff0c;其核心目标是确保社会的稳定和居民的福祉。随着全球化、城市化和技术进步&#xff0c;社会面临的风险和威胁日益复杂多样&#xff0c;从自然灾害到人为事故&#xff0c;从公共卫生危机到恐怖袭击&#xff0c;公…

高可用hadoop分布式节点的扩容

解决方案 修改hdfs-site.xml 文件 原xml文件 <?xml version"1.0" encoding"UTF-8"?> <?xml-stylesheet type"text/xsl" href"configuration.xsl"?> <!--Licensed under the Apache License, Version 2.0 (th…

运维Tips | Ubuntu 24.04 安装配置 xrdp 远程桌面服务

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Ubuntu 24.04 Desktop 安装配置 xrdp 远程桌面服务 描述:Xrdp是一个微软远程桌面协议(RDP)的开源实现,它允许我们通过图形界面控制远程系统。这里使用RDP而不是VNC作为远程桌面,是因为Windows自带的远程桌面连接软…

回答 | 开源项目有哪些机遇与挑战?

随着全球经济和科技环境的快速变化&#xff0c;开源软件项目的蓬勃发展成为了开发者社区的热门话题。越来越多的开发者和企业选择参与开源项目&#xff0c;以推动技术创新和实现协作共赢。你如何看待当前开源项目的发展趋势&#xff1f;你在参与开源项目时有哪些经验和收获&…

单身杯_RE

唉&#xff0c;遇到几个比较繁琐的题目&#xff0c;搞的心态都有点炸了&#xff0c;0.0 magic 这题也就那样&#xff0c;初时想要用用 angr 跑了一下&#xff0c;没搞出来&#xff0c;之后再去好好搞清楚吧&#xff0c;也不是特别清楚运用。 然后就自己去看了&#xff0c;就是…

从实时监控到风险智能预警:EasyCVR视频AI智能监控技术在工业制造中的应用

随着科技的不断进步和工业制造领域的持续发展&#xff0c;传统的生产管理方式正逐渐转型&#xff0c;迈向更加智能、高效和安全的新阶段。在这个变革过程中&#xff0c;视频智能监控技术凭借其独特的优势&#xff0c;成为工业制造领域的管理新引擎&#xff0c;推动着从“制造”…

“删错文件后如何高效挽救?两大恢复策略全解析“

在数字化日益深入生活的今天&#xff0c;数据已成为我们工作、学习和娱乐不可或缺的一部分。然而&#xff0c;删错文件的经历却如同数字世界中的一场“小插曲”&#xff0c;不经意间就可能让我们陷入数据丢失的困境。无论是误触删除键、清空回收站&#xff0c;还是软件故障导致…