flask flask-socketio創建一個網頁聊天應用

應用所需環境:

python 3.11.11
其他 只需要通過這個命令即可
pip install flask==3.1.0 Flask-SocketIO==5.4.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
最好是用conda創建一個新的虛擬環境來驗證
完整的pip list如下
Package          Version
---------------- -------
bidict           0.23.1
blinker          1.9.0
click            8.1.7
Flask            3.1.0
Flask-SocketIO   5.4.1
h11              0.14.0
itsdangerous     2.2.0
Jinja2           3.1.4
MarkupSafe       3.0.2
pip              24.2
python-engineio  4.11.1
python-socketio  5.11.4
setuptools       75.1.0
simple-websocket 1.1.0
Werkzeug         3.1.3
wheel            0.44.0
wsproto          1.2.0

應用的結構目錄

在這里插入圖片描述

app.py中的內容:

from flask import Flask, render_template, request
from flask_socketio import SocketIO, send, emit, join_room, leave_room# import eventlet
# eventlet.monkey_patch()app = Flask("chatWare", static_folder="static", template_folder="templates")
app.config['SECRET_KEY'] = "bruh"
socketio = SocketIO(app)@app.route("/")
def main():return render_template("index.html")
# 監聽的可能是前端的socket.send這個方法 
@socketio.on('message')
def handleMessage(msg):print("收到: " + msg)# send(msg, broadcast=True)  # 這個發回去了,但是前端沒有定義方法進行接收 所以是不是可以不用發# 
@socketio.event  #加一個@socketio.event 表明他是個方法,被裝飾的方法可以被前端用socket.emit('sendMsg')這種方式發送給后端。 message就是前端用emit的第二個參數
def sendMsg(message):print(message)# 下邊這個emit中的“SendtoAll”是 前端socket.on('SendtoAll')的監聽對象   to=message['room'] 表示給房間里的所有人都發送消息  如果不寫則表示個自己一個人回消息# request.sid貌似是每對socket連接都會不一樣,但是沒斷開的應該是一樣的emit('SendtoAll', {"msg":message["msg"], "user":request.sid}, to=message["room"])@socketio.event
def joinRoom(message):# global Room  # 沒有被用到吧,應該沒啥用# print(message)join_room(message['room'])  #加入房間有專門的函數,不用我們管emit("roomJoined", {"user" : request.sid,"room" : message['room']}, to=message['room'])@socketio.event
def leaveRoom(message):print(message)emit('roomLeftPersonal', {"room": message['room'], "user": request.sid})  # 這個沒寫to=message['room'] 表示給自己一個人回消息leave_room(message['room'])  # 可神奇,他咋知道那個人離開了,可能是socket連接所以知道emit('roomLeft', {"room":message['room'], "user":request.sid}, to=message['room'])if __name__ == "__main__":app.run(host="0.0.0.0", port=5000, debug=True, threaded=True)socketio.run(app)

index.html中的內容如下:

<!DOCTYPE html>
<html lang="en"><head><title>flask socketio通信</title>
<!--        flask-socketio--><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js" integrity="sha512-bLT0Qm9VnAYZDflyKcBaQ2gg0hSYNQrJ8RilYldYQ1FxQYoCLtUjuuRuZo+fjqhx/qtq/1itJ0C2ejDxltZVFg==" crossorigin="anonymous"></script><!--        Jquery--><!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script> --><script type="text/javascript" src="//cdn.bootcss.com/socket.io/3.1.2/socket.io.min.js"></script><script type="text/javascript" src="{{url_for('static', filename='js/index.js')}}"></script></head><body><h3>Join Room</h3><form id="joinRoom" method="POST" action="#"><label>Room Number</label><input type="text" id="roomNum" required><input type="submit" id="submitRoomNum"></form><button id="leave_room">Leave</button><h1>Hello World</h1><ul id="chatContent"><li>Text</li></ul><form id="SubmitForm" method="POST" action="#"><h3>發送文字</h3><textarea placeholder="輸入文字" name="msg" id="chatMsg" required></textarea><button type="submit">發送</button></form></body>
</html>

index.js中的內容如下:

$(document).ready(function(){// 1  一般的執行步驟 1,2,3....var socket = io();//  連接socketsocket.on('connect', function (){socket.send('Client Connected')});// 4$('form#SubmitForm').submit(function (event){// 發送給后端的sendMsg方法socket.emit('sendMsg', {msg:$('#chatMsg').val(),room:$('#roomNum').val()});$('#chatMsg').val("");return false});//  2 $('form#joinRoom').submit(function (event){socket.emit('joinRoom', {room:$('#roomNum').val()})return false});// 6$('#leave_room').on('click', function (){socket.emit('leaveRoom', {room:$('#roomNum').val()})console.log("sent")});// 3socket.on('roomJoined', function (msg, cb) {$('#chatContent').append('<li>' + msg.user + 'has joined room'+ msg.room +' </li>')});// 8 socket.on('roomLeft', function (msg, cb) {$('#chatContent').append('<li>' + msg.user + 'has left room'+ msg.room +' </li>')});// 7socket.on('roomLeftPersonal', function (msg, cb) {$('#chatContent').append('<li>' + 'you have left room'+ msg.room +' </li>')});// 5 監聽后端的SendtoAll方法socket.on('SendtoAll', function (msg, cb) {$('#chatContent').append('<li>' + msg.user + ': ' + msg.msg + '</li>')});
})

在終端中輸入python app.py 并回車,然后打開兩個網頁分別輸入http://127.0.0.1:5000并回車即可進行聊天

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63555.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63555.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63555.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

聯邦學習防止數據泄露

文章目錄 聯邦學習防止數據泄露的原理聯邦學習的優勢聯邦學習與集中式學習的成本分析聯邦學習的實際應用案例個人設想參考文獻 聯邦學習 (Federated Learning) 是一種分布式機器學習技術&#xff0c;旨在解決數據隱私保護問題。它允許在分散的數據源上進行模型訓練&#xff0c;…

STM32 水質水位檢測項目(硬件架構)及(軟件架構)

硬件選型 水位測量模塊 TDS采集模塊 外置ADC模塊&#xff08;ADS1115&#xff09; 水位測量模塊使用方法 水位測量原理 壓力傳感器&#xff1a;水越深壓力越大 P ρgh Fps Fρgh*s P大氣壓 水位測量傳感器本質上是一個壓力測量傳感器。壓力的值和傳感器產生的電壓值是線…

C# 6.0 連接elasticsearch數據庫

在 C# 6.0 中連接 Elasticsearch 數據庫,您可以使用官方的 Elasticsearch 客戶端庫 NEST。NEST 是一個高性能的 .NET 客戶端,用于與 Elasticsearch 進行交互。以下是一個詳細的步驟指南,幫助您在 C# 6.0 項目中連接和操作 Elasticsearch。 1. 安裝 NEST 包 首先,您需要在您…

服務器數據恢復—RAIDZ離線硬盤數超過熱備盤數導致陣列崩潰的數據恢復案例

服務器存儲數據恢復環境&#xff1a; ZFS Storage 7320存儲陣列中有32塊硬盤。32塊硬盤分為4組&#xff0c;每組8塊硬盤&#xff0c;共組建了3組RAIDZ&#xff0c;每組raid都配置了熱備盤。 服務器存儲故障&#xff1a; 服務器存儲運行過程中突然崩潰&#xff0c;排除人為誤操…

Java轉C++之編程范式

1. 過程式編程&#xff08;Procedural Programming&#xff09; 在 C 中的表現 過程式編程是通過一系列的函數調用來實現程序的功能。函數是核心構建單元&#xff0c;數據和操作通過函數進行交互。 C 中&#xff1a;可以使用普通的函數和全局變量來進行過程式編程。Java 中&…

llama2中的model.py中的結構示意圖

參考文章&#xff1a;https://zhuanlan.zhihu.com/p/679640407

開放詞匯目標檢測(Open-Vocabulary Object Detection, OVOD)綜述

定義 開放詞匯目標檢測&#xff08;Open-Vocabulary Object Detection, OVOD&#xff09;是一種目標檢測任務&#xff0c;旨在檢測和識別那些未在訓練集中明確標注的物體類別。傳統的目標檢測模型通常只能識別有限數量的預定義類別&#xff0c;而OVOD模型則具有識別“開放詞匯…

Vue與React:前端框架的巔峰對決

文章目錄 一、引言&#xff08;一&#xff09;前端框架發展現狀簡述 二、Vue 與 React 框架概述&#xff08;一&#xff09;Vue.js 簡介&#xff08;二&#xff09;React.js 簡介 三、開發效率對比&#xff08;一&#xff09;Vue 開發效率分析&#xff08;二&#xff09;React …

3分鐘讀懂數據分析的流程是什么

數據分析是基于商業目的&#xff0c;有目的地進行收集、整理、加工和分析數據&#xff0c;提煉出有價值的 信息的一個過程。整個過程大致可分為五個階段&#xff0c;具體如下圖所示。 1.明確目的和思路 在開展數據分析之前&#xff0c;我們必須要搞清楚幾個問題&#xff0c;比…

vba批量化調整word的圖和圖表標題

vba代碼 將圖片進行居中操作 Sub ChangePictureFormate()Dim oPara As ParagraphDim oRange As RangeDim i As LongDim beforeIsPicture As BooleanbeforesIsPicture False 確保文檔中至少有圖片If ActiveDocument.InlineShapes.Count 0 ThenMsgBox "沒有找到圖片。&qu…

llama.cpp:PC端測試 MobileVLM -- 電腦端部署圖生文大模型

llama.cpp&#xff1a;PC端測試 MobileVLM 1.環境需要2.構建項目3.PC測試 1.環境需要 以下是經實驗驗證可行的環境參考&#xff0c;也可嘗試其他版本。 &#xff08;1&#xff09;PC&#xff1a;Ubuntu 22.04.4 &#xff08;2&#xff09;軟件環境&#xff1a;如下表所示 工…

詞嵌入(Word Embedding):自然語言處理的基石

目錄 ?編輯 詞嵌入&#xff08;Word Embedding&#xff09;&#xff1a;自然語言處理的基石 引言 詞嵌入的基本概念 詞嵌入的主要方法 1. Word2Vec 2. GloVe 3. FastText 4. ELMo 5. BERT 詞嵌入的應用場景 詞嵌入的研究進展 結論 詞嵌入&#xff08;Word Embedd…

AutoSarOS中調度表的概念與源代碼解析

--------AutoSarOS調度表的概念 一、AutoSarOS 是什么以及調度表的重要性 AutoSar(Automotive Open System Architecture)是汽車行業的一個開放式軟件架構標準哦。它就像是一種大家都遵循的規則,能讓不同的軟件供應商一起合作開發汽車軟件,這樣軟件就能被重復使用,開發效…

半連接轉內連接 | OceanBase SQL 查詢改寫

查詢優化器是關系型數據庫系統的核心模塊&#xff0c;是數據庫內核開發的重點和難點&#xff0c;也是衡量整個數據庫系統成熟度的“試金石”。為了幫助大家更好地理解 OceanBase 查詢優化器&#xff0c;我們撰寫了查詢改寫系列文章&#xff0c;帶大家更好地掌握查詢改寫的精髓&…

android opencv導入進行編譯

1、直接新建module進行導入&#xff0c;選擇opencv的sdk 導入module模式&#xff0c;選擇下載好的sdk&#xff0c;修改module name為OpenCV490。 有報錯直接解決報錯&#xff0c;沒報錯直接運行成功。 2、解決錯誤&#xff0c;同步成功 一般報錯是gradle版本問題較多。我的報…

通過阿里云 Milvus 與 PAI 搭建高效的檢索增強對話系統

背景介紹 阿里云向量檢索服務Milvus版&#xff08;簡稱阿里云Milvus&#xff09;是一款云上全托管服務&#xff0c;確保了了與開源Milvus的100%兼容性&#xff0c;并支持無縫遷移。在開源版本的基礎上增強了可擴展性&#xff0c;能提供大規模 AI 向量數據的相似性檢索服務。相…

【批量生成WORD和PDF文件】根據表格內容和模板文件批量創建word文件,一次性生成多個word文檔和批量創建PDF文件

如何按照Word模板和表格的數據快速制作5000個word文檔 &#xff1f; 在與客戶的合作的中需要創建大量的合同&#xff0c;這些合同的模板大概都是一致的&#xff0c;是不是每次我們都需要填充不一樣的數據來完成&#xff1f; 今天用表格數據完成合同模板的填充&#xff0c;批量…

pip使用方法

1. 安裝包&#xff1a; pip install &#xff1a;安裝指定的 Python 包。 pip install &#xff1a;安裝特定版本的 Python 包。 pip install -r requirements.txt&#xff1a;從文件中讀取依賴列表并安裝所有列出的包。 pip install --pre &#xff1a;允許安裝預發布或開發版…

Windows11 安裝 Ubuntu-20.04,同時安裝配置 zsh shell,配置 git 別名(alias),大大提高開發效率

背景&#xff1a;家里配置了一臺 Windows 電腦&#xff0c;有時候需要用到 vscode 開發測試一些代碼&#xff0c;在使用過程中發現原生 windows 敲代碼不是很友好&#xff0c;于是想到配置 wsl&#xff0c;安裝 Ubuntu&#xff0c;并安裝配置 zsh shell&#xff0c;同時配置 gi…

什么是漸進式 Web 應用,有哪些特點

漸進式 Web 應用 (Progressive Web Apps, PWAs) 的定義與特點 一、定義 漸進式 Web 應用&#xff08;Progressive Web App&#xff0c;簡稱 PWA&#xff09;是一種結合了傳統 Web 技術和現代移動應用特性的新型應用程序形式。PWAs 可以像普通網站一樣通過瀏覽器訪問&#xff…