用flask框架flask-sock和websocket创建一个自己的聊天界面

news/2025/1/12 22:54:41/

WebSocket 协议在10年前就已经标准化了(在2011年,你能相信吗?)所以我相信你不需要介绍。但是如果你不熟悉它,WebSocket 是 HTTP 协议的一个扩展,它在客户端和服务器之间提供了一个永久的、双向的通信通道,在这里双方可以实时地发送和接收数据,而不受 HTTP 的请求/响应周期的限制。

如果您正在使用 Flask 2,那么您现在有了一个名为 Flask-Sock 的新扩展,它为您的应用程序提供了现代 WebSocket 支持。在本文中,我将向您展示如何使用这个扩展。

先安装依赖:

pip install flask-sock

扩展通过创建 Sock ()实例添加到 Flask 应用程序中。如果您有一个全局应用程序对象,您可以使用直接初始化方法:

sock = Sock(app)

 如果在工厂函数中创建应用程序实例,那么两步初始化方法也可以工作:

sock = Sock()def create_app():app = Flask(__name__)sock.init_app(app)

Sock 实例有一个路由修饰器,它的工作方式与 Flask 的非常相似,但是它添加了 WebSocket 协议握手,这样路由就可以使用 WebSocket 而不是 HTTP。下面是一个简单的服务器,它向客户机发送任何内容都会回显到该服务器:

@sock.route('/echo')
def echo(ws):while True:data = ws.receive()ws.send(data)

一个完整的例子

让我们来看一个完整的例子,下面是 Flask 应用程序的代码:

from flask import Flask, render_template
from flask_sock import Sockapp = Flask(__name__)
sock = Sock(app)@app.route('/')
def index():return "你好,世界"@app.route('/ws')
def websocket():return """<!doctype html><html><head><title>Flask-Sock Demo</title></head><body><h1>Flask-Sock Demo</h1><div id="log"></div><br><form id="form"><label for="text">Input: </label><input type="text" id="text" autofocus></form><script>const log = (text, color) => {document.getElementById('log').innerHTML += `<span style="color: ${color}">${text}</span><br>`;};const socket = new WebSocket('ws://' + location.host + '/echo');socket.addEventListener('message', ev => {log('<<< ' + ev.data, 'blue');});document.getElementById('form').onsubmit = ev => {ev.preventDefault();const textField = document.getElementById('text');log('>>> ' + textField.value, 'red');socket.send(textField.value);textField.value = '';};</script></body></html>"""@sock.route('/echo')
def echo(self):while True:data = self.receive()self.send(data)if __name__ == '__main__':app.run(host="0.0.0.0", port=8989)

这基于上面显示的 echo 服务器代码。应用程序有一个url:http://192.168.110.196:8989/ws,它返回客户端页面,还有一个/echo 路由,它实现了 WebSocket 回显端点。

下面是html 页面内容:

<!doctype html>
<html><head><title>Flask-Sock Demo</title></head><body><h1>Flask-Sock Demo</h1><div id="log"></div><br><form id="form"><label for="text">Input: </label><input type="text" id="text" autofocus></form><script>const log = (text, color) => {document.getElementById('log').innerHTML += `<span style="color: ${color}">${text}</span><br>`;};const socket = new WebSocket('ws://' + location.host + '/echo');socket.addEventListener('message', ev => {log('<<< ' + ev.data, 'blue');});document.getElementById('form').onsubmit = ev => {ev.preventDefault();const textField = document.getElementById('text');log('>>> ' + textField.value, 'red');socket.send(textField.value);textField.value = '';};</script></body>
</html>

当你访问:http://192.168.110.196:8989/ws

你就能看到一个这样的页面: 并且会默认创建一个websocket链接

让你输入消息并发送的时候,就能看到效果了:

 


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

相关文章

Computed

保持单向数据流 大家都知道 vue 是单项数据流的&#xff0c;子组件不能直接修改父组件传过来的 props&#xff0c;但是在我们封装组件使用 v-model 时&#xff0c;不小心就会打破单行数据流的规则&#xff0c;例如下面这样&#xff1a; <!-- 父组件 --> <my-compone…

Vite + Vue3 实现前端项目工程化

通过官方脚手架初始化项目 第一种方式&#xff0c;这是使用vite命令创建&#xff0c;这种方式除了可以创建vue项目&#xff0c;还可以创建其他类型的项目&#xff0c;比如react项目 npm init vitelatest 第二种方式&#xff0c;这种方式是vite专门为vue做的配置&#xff0c;…

【SSM】登录和注册

框架 controller 控制层 dao 持久层 interceptor 拦截器 model 实体层 uils 工具类 service 业务层 resources 资源文件层 mapper 放编写sql语句的文件&#xff0c;与持久层的文件对应 具体代码 Controller //控制层 public class UserController { //用于调用Servic…

【音视频】H264视频压缩格式

H264简介 H.264从1999年开始&#xff0c;到2003年形成草案&#xff0c;最后在2007年定稿有待核实。在ITU的标准里称为H.264, 在MPEG的标准里是MPEG-4的一个组成部分-MPEG-4 Part 10&#xff0c;又叫Advanced Video Codec&#xff0c;因此常常称为MPEG-4AVC或直接叫AVC。 压缩算…

2000-2018年各省能源消费和碳排放数据

2000-2018年各省能源消费和碳排放数据 1、时间&#xff1a;2000-2018年 2、范围&#xff1a;30个省市 3、指标&#xff1a;id、year、ENERGY、COAL、碳排放倒数*100 4、来源&#xff1a;能源年鉴 5、指标解释&#xff1a; 2018年碳排放和能源数据为插值法推算得到 碳排放…

[考前速记] 最大公约数与最大公倍数

最大公约数 int gcd(int a,int b){if (b0)return a;else return gcd(b,a%b); } 熟练了可以写成&#xff1a; int gcd(int a,int b){return b ? gcd(b,a%b):a; } 值得注意的是&#xff1a;让a和b均为非负数&#xff0c;可以使用algorithm下的abs(int x)和cmath下的fabs(dou…

会话控制学习

文章目录 介绍cookieexpress中使用cookie获取cookie session配置区别 介绍 cookie express中使用cookie 退出登录就是删除cookie 获取cookie 添加中间键后&#xff0c;直接获取 session 配置 区别

异步FIFO设计的仿真与综合技术(6)

概述 本文主体翻译自C. E. Cummings and S. Design, “Simulation and Synthesis Techniques for Asynchronous FIFO Design 一文&#xff0c;添加了笔者的个人理解与注释&#xff0c;文中蓝色部分为笔者注或意译。前文链接&#xff1a; 异步FIFO设计的仿真与综合技术&#xf…