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.mzph.cn/bicheng/42389.shtml

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

相关文章

Nginx 报错问题汇总

目录 一、nginx: [emerg] invalid number of arguments in "include" directive in C:\Program Files\nginx-1.15.4/conf/nginx.conf:61 总结: 二、nginx: [error] OpenEvent("Global\ngx_reload_2152") failed (5: Access is denied) 解决…

51-3 内网信息收集 - 获取RDP密码信息(没有实验成功)

获取常见应用软件凭据 注意: %USERPROFILE% 是环境变量。在使用系统权限时,可以将 %USERPROFILE% 替换为绝对路径,或使用其他用户的令牌进行操作。 获取 RDP 保存的凭据(远程桌面) 为了避免每次连接服务器都进行身份验证,经常使用 RDP 远程桌面连接远程服务器的用户可能…

【bazel】 一文读懂Starlark

Starlark 的语言编码 当我们编写工作区和构建文件时,我们使用一种名为 Starlark 的语言进行编码,它是 Python 的一种自定义变体。现在,对于所有 Python 开发人员来说,请保持您的敬意。Starlark 是 Python 的一种变体 - 即该语言的…

LeetCode436:寻找右区间

题目链接&#xff1a;436. 寻找右区间 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> findRightInterval(vector<vector<int>>& intervals) {vector<pair<int, int>> startIntervals;int n intervals.size…

H5小游戏开发,广告游戏开发制作

以下是一个 H5 小游戏开发的基本步骤和流程&#xff1a; 需求分析 确定游戏的类型&#xff0c;如益智类、动作类、冒险类等。明确游戏的目标、玩法规则、难度级别、关卡设计等。 技术选型 选择开发框架和工具&#xff0c;常用的 H5 游戏开发框架有 Phaser、CreateJS 等。确定使…

ubuntu下运行程序时提示缺库问题的有效解决方法

目录 一、问题现象二、解决方式三、总结 一、问题现象 当我们平时在ubuntu上运行一个程序时时长会遇到如下情况&#xff0c;含义为本机缺少执行程序需要的库 这时候我们可能会根据缺少的库使用apt install 库名的模糊名字 进行安装&#xff0c;然后再去运行&#xff0c;此时可…

java-hashset 源码分析 3

### 9. HashSet 的局限性 #### 9.1 无序性 HashSet 不保证元素的顺序&#xff0c;这意味着插入顺序和遍历顺序可能不同。如果需要有序集合&#xff0c;可以考虑使用 LinkedHashSet 或 TreeSet。 #### 9.2 性能依赖于哈希函数 HashSet 的性能高度依赖于哈希函数的质量。如果…

网页生成二维码、在线演示

https://andi.cn/page/621504.html

【OJ】运行时错误(Runtime Error)导致递归爆栈问题

在进行OJ赛时&#xff0c; 题目&#xff1a;给你一个整数n&#xff0c;问最多能将其分解为多少质数的和。在第一行输出最多的质数数量k,下一行输出k个整数&#xff0c;为这些质数。 出现运行时错误 代码如下&#xff1a; def main():# code heren int(eval(input()))list …

《优化接口设计的思路》系列:第2篇—小程序性能优化

优化Uniapp应用程序的性能可以从以下几个方面进行优化&#xff1a; 1.减少页面加载时间&#xff1a;避免页面过多和过大的组件&#xff0c;减少不必要的资源加载。可以使用懒加载的方式&#xff0c;根据用户的实际需求来加载页面和组件。 2.节流和防抖&#xff1a;对于频繁触发…

AI中药处方模型构建与案例

在中医领域,人工智能(AI)可以生成各种指令来辅助诊断、治疗和研究。 1. 诊断辅助指令: 根据患者的症状和体征,自动分析并生成可能的中医证候诊断建议。利用中医望闻问切四诊信息,智能识别关键症状,提供对应的中医辨证思路。2. 治疗建议指令: 根据辨证结果,自动推荐相应…

力扣304.二维区域和检索

力扣304.二维区域和检索 二维前缀和的简单应用 class NumMatrix {vector<vector<int>> sum;public:NumMatrix(vector<vector<int>>& matrix) {int m matrix.size(),n matrix[0].size();sum.resize(m1,vector<int>(n1)); for(int i0;i&…

Java语言程序设计篇一

Java语言概述 Java语言起源编程语言最新排名名字起源Java语言发展历程Java语言的特点Java虚拟机垃圾回收Java语言规范Java技术简介Java程序的结构Java程序注意事项&#xff1a;注释编程风格练习 Java语言起源 1990年Sun公司提出一项绿色计划。1992年语言开发成功最初取名为Oak…

维护el-table列,循环生成el-table

1、lib/setting.js&#xff08;维护table列&#xff09; const columns[{ label: 类型, prop: energyName, width: 150, isText: true },{ label: 消耗量(t或10⁴m), prop: inputNum, isInput: true },{label: CO₂,children: [// { label: 核算因子, prop: co2FactorValue, w…

cs231n作业1——Softmax

参考文章&#xff1a;cs231n assignment1——softmax Softmax softmax其实和SVM差别不大&#xff0c;两者损失函数不同&#xff0c;softmax就是把各个类的得分转化成了概率。 损失函数&#xff1a; def softmax_loss_naive(W, X, y, reg):loss 0.0dW np.zeros_like(W)num_…

【Linux】进程的概念 + 查看进程

前言&#xff1a; 在前面我们学习了Liunx的基本指令和权限相关知识&#xff0c;还有基本工具的使用&#xff0c;有了以上的基础知识我们本章将正式接触Linux操作系统。 目录 1.冯诺依曼体系结构1.1 内存存在的意义1.2 程序加载到内存的含义1.3 程序的预加载&#xff1a; 2 .认识…

安卓备忘录App开发

安卓备忘录APP开发,文章末尾有源码和apk安装包 目标用户: 普通安卓手机用户,需要一个简单易用的备忘录App来记录和管理日常事务。 主要功能: 用户注册: 用户可以创建一个账号,输入用户名和密码。 用户登录: 用户可以通过用户名和密码登录到应用。 用户信息存储: 用户名和…

TCP一定可靠吗

背景 公司某个服务发送TCP报文后,得到的响应是非预期数据 原因竟然是:TCP包的 payload 数据某个bit位被翻转,但是 checksum 的值一样,错误的包被分发给了上层服务 Checksum介绍 IP 头有自己的 Checksum,TCP、UDP 也有自己的 Checksum,分别校验不同部分的数据 IP 头的 …

触摸与指针:深入探索 WebKit 的 Pointer Events 支持

触摸与指针&#xff1a;深入探索 WebKit 的 Pointer Events 支持 在现代 Web 应用中&#xff0c;用户交互的方式越来越多样化&#xff0c;包括触摸、鼠标、笔等多种输入设备。WebKit 作为领先的浏览器引擎之一&#xff0c;对指针事件&#xff08;Pointer Events&#xff09;的…

影响Mongodb数据写入性能的因素

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第83篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…