FastAPI 学习之路(四十四)WebSockets

news/2024/12/22 14:48:30/

我们之前的分析都是基于http的请求,那么如果是websockets可以支持吗,答案是可以的,我们来看下是如何实现的。

from fastapi import WebSocket, FastAPI
from fastapi.responses import HTMLResponseapp = FastAPI()html = """<!DOCTYPE html><html><head><title>Chat</title></head><body><h1>WebSocket 聊天</h1><form action="" onsubmit="sendMessage(event)"><input type="text" id="messageText" autocomplete="off"/><button>Send</button></form><ul id='messages'></ul><script>var ws = new WebSocket("ws://localhost:8000/ws");ws.onmessage = function(event) {var messages = document.getElementById('messages')var message = document.createElement('li')var content = document.createTextNode(event.data)message.appendChild(content)messages.appendChild(message)};function sendMessage(event) {var input = document.getElementById("messageText")ws.send(input.value)input.value = ''event.preventDefault()}
</script></body></html>"""@app.get("/")
async def get_page():return HTMLResponse(html)@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):await websocket.accept()while True:data = await websocket.receive_text()await websocket.send_text(f"接收到的消息是:{data}")

其实很简单,我们在后端写一个接收消息的接口,有消息来了,我们就处理这个消息,不出之前都是处理的http,现在是websocket。我们把拿到的消息直接返回给了前端。

我们看下效果:

 如此我们简单的实现了一个websocket的功能。那么我们有一条特定的消息,我们就关闭聊天,如何处理呢?

# 接收特定的消息后,终止该聊天
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):await websocket.accept()while True:data = await websocket.receive_text()if data == "bye":await websocket.send_text(f"请注意:窗口即将关闭")await websocket.send_text("窗口已关闭")await websocket.close()breakelse:await websocket.send_text(f"接收到的消息是:{data}")

前段代码没有改,只是修改了后端。

其实这里去实现websocket通信还是很简单的。

           当然我们在请求中也可以使用

  • Depends
  • Security
  • Cookie
  • Header
  • Path
  • Query

       我们可以看下面一个简单的后端写的例子

# 使用多种参数,比如获取cookie等
from typing import Optional
from fastapi import Cookie, Query, status, Dependsasync def get_cookie_or_token(websocket: WebSocket,session: Optional[str] = Cookie(None),token: Optional[str] = Query(None),
):if session is None and token is None:await websocket.close(code=status.WS_1008_POLICY_VIOLATION)return session or token@app.websocket("item/ws")
async def websocket_endpoint(websocket: WebSocket,q: Optional[int] = None,cookie_or_token: str = Depends(get_cookie_or_token),
):await websocket.accept()while True:data = await websocket.receive_text()await websocket.send_text(f"Session cookie or query token value is: {cookie_or_token}")if q is not None:await websocket.send_text(f"parameter q is: {q}")await websocket.send_text(f"Message text was: {data}, for : {q}")

虽然我们只是简单的实现了后端,但是可以看出fastapi对于websocket有一个很好的支持 


http://www.ppmy.cn/news/1475829.html

相关文章

WEB前端03-CSS3基础

CSS3基础 1.CSS基本概念 CSS是Cascading Style Sheets&#xff08;层叠样式表&#xff09;的缩写&#xff0c;它是一种对Web文档添加样式的简单机制&#xff0c;是一种表现HTML或XML等文件外观样式的计算机语言&#xff0c;是一种网页排版和布局设计的技术。 CSS的特点 纯C…

[Day 29] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的供應鏈管理應用 區塊鏈技術自2008年比特幣誕生以來&#xff0c;逐漸被廣泛應用於各種領域&#xff0c;其中供應鏈管理是其最有潛力的應用之一。區塊鏈的去中心化、不可篡改和透明性特點&#xff0c;使其在解決傳統供應鏈中的信息不對稱、數據篡改和信任問題方面具有顯…

C调用C++接口

C文件 #include <ctype.h> #include <sys/time.h> #include <sys/stat.h> #include <time.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdbool.h> #include <unistd.h> #include <s…

Macbook pro插移动硬盘没反应,Macbook pro移动硬盘读不了怎么办 macbook插移动硬盘后无法使用

为了弥补Macbook pro硬盘容量的缺失&#xff0c;我们有时候会使用到外接硬盘或移动硬盘。一般来说&#xff0c;这些硬盘都是即插即用的&#xff0c;可能部分要安装插件。不过&#xff0c;在一些特殊情况下&#xff0c;也会遇到插硬盘没反应等问题。本文会给大家解答Macbook pro…

RustChinaConf 2024(Rust中国大会2024)号集令

自六月官宣以来&#xff0c;Rust中国大会2024受到了众多厂商的青睐。目前已经确定的重量级赞助商有&#xff1a; ICP&#xff08;互联网计算机&#xff09;非凸科技在线途游蚂蚁金服JetBrain GEAR Foundation INFINI Labs Greptime 等 其中钻石赞助仅剩少量名额 请有意向赞助大…

勒索防御第一关 亚信安全AE防毒墙全面升级 勒索检出率提升150%

亚信安全信舷AE高性能防毒墙完成能力升级&#xff0c;全面完善勒索边界“全生命周期”防御体系&#xff0c;筑造边界勒索防御第一关&#xff01; 勒索之殇&#xff0c;银狐当先 当前勒索病毒卷携着AI技术&#xff0c;融合“数字化”的运营模式&#xff0c;形成了肆虐全球的网…

Spring Boot 3.3 【二】Spring Boot自动配置机制深度解析

简单动作&#xff0c;深刻联结。在这技术海洋&#xff0c;我备好舟&#xff0c;等你扬帆。启航吧&#xff01; &#x1f31f;点击【关注】&#xff0c;解锁定期的技术惊喜&#xff0c;让灵感与知识的源泉不断涌动。 &#x1f44d;一个【点赞】&#xff0c;如同心照不宣的默契&a…

【数智化案例展】吉林省消防救援总队——基于大语言模型的119智慧助手

‍ 嘉诚信息案例 本项目案例由嘉诚信息投递并参与数据猿与上海大数据联盟联合推出的《2024中国数智化转型升级创新服务企业》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着信息时代的迅猛发展&#xff0c;消防人员正面临前所未有的知识爆炸挑战。为了高…