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

news2025/1/11 0:08:05

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 Sock

app = 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.coloradmin.cn/o/1024030.html

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

相关文章

91 # 实现 express 的优化处理

上一节实现 express 的请求处理&#xff0c;这一节来进行实现 express 的优化处理 让 layer 提供 match 方法去匹配 pathname&#xff0c;方便拓展让 layer 提供 handle_request 方法&#xff0c;方便拓展利用第三方库 methods 批量生成方法性能优化问题 进行路由懒加载&#…

亚马逊 CodeWhisperer 初体验

1、CodeWhisperer 介绍 CodeWhisperer 是亚马逊出品的一款基于机器学习的通用代码生成器&#xff0c;可实时提供代码建议。类似 Cursor 和 Github Copilot 编码工具。 官网&#xff1a;AI 代码生成器 - Amazon CodeWhisperer - AWS 在编写代码时&#xff0c;它会自动根据您现…

Flink sql 1.17笔记

环境准备 # 启动hadoop集群 # 启动Flink yarn session (base) [link999hadoop102 flink-1.17.0]$ bin/yarn-session.sh -d# 启动finksql客户端 (base) [link999hadoop102 flink-1.17.0]$ bin/sql-client.sh -s yarn-session# 如果有初始化文件 bin/sql-client.sh embedded -s …

数据结构 - 二叉树

文章目录 目录 文章目录 前言 一 . 树型结构 1.1 树的概念(了解) 1.2 数的常用术语 (掌握) 1.3 树的应用(了解) 1.4 树相较于数组和链表的优势(了解) 二 . 二叉树(重点) 2.1 二叉树的概念 2.2 两种特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的基本操作 2.4.1 二叉树的前序遍历 …

高云FPGA系列教程(7):ARM GPIO外部中断

文章目录 [toc]GPIO中断简介FPGA配置常用函数MCU程序设计工程下载 本文是高云FPGA系列教程的第7篇文章。 本篇文章介绍片上ARM Cortex-M3硬核处理器GPIO外部的使用&#xff0c;演示按键中断方式来控制LED亮灭&#xff0c;基于TangNano 4K开发板。 参考文档&#xff1a;Gowin_E…

go学习之函数知识

函数 文章目录 函数1.函数入门(1)为什么需要函数&#xff1f;(2)什么是函数&#xff1a;2.包3.函数的调用机制通俗理解调用过程&#xff1a;return语句递归调用 4.函数注意事项和细节讨论5.init函数6.匿名函数7.闭包8.defer9.函数参数的传递方式10.字符串中常用的函数11.时间和…

JVM中的java同步互斥工具应用演示及设计分析

1.火车站售票系统仿真 某火车站目前正在出售火车票&#xff0c;共有50张票&#xff0c;而它有3个售票窗口同时售票&#xff0c;下面设计了一个程序模拟该火车站售票&#xff0c;通过实现Runnable接口实现&#xff08;模拟网络延迟&#xff09;。 伪代码&#xff1a; Ticket类…

Java代码质量评估工具

概述 Java代码的质量评估主要包括代码的可维护性、健壮性、以及在运行时能达到既定的性能目标&#xff0c;可维护性主要包括代码的可读性、在关键的代码上提供详细注释、在设计类、方法以及代码逻辑时符合设定的编码规范&#xff0c;健壮性主要包括编写代码时应使用常用的设计…

【JAVA-Day26】数组解析:什么是数组?如何定义?

数组解析&#xff1a;什么是数组&#xff1f;如何定义&#xff1f; 数组解析&#xff1a;什么是数组&#xff1f;如何定义&#xff1f;摘要一、什么是数组数组的特性&#xff1a;不同类型的数组&#xff1a;数组的应用场景&#xff1a;数组的限制和挑战&#xff1a; 二、如何定…

【论文阅读 07】Anomaly region detection and localization in metal surface inspection

比较老的一篇论文&#xff0c;金属表面检测中的异常区域检测与定位 总结&#xff1a;提出了一个找模板图的方法&#xff0c;使用SIFT做特征提取&#xff0c;姿态估计看差异有哪些&#xff0c;Hough聚类做描述符筛选&#xff0c;仿射变换可视化匹配图之间的关系&#xf…

【算法基础】数学知识

质数 质数的判定 866. 试除法判定质数 - AcWing题库 时间复杂度是logN #include<bits/stdc.h> using namespace std; int n; bool isprime(int x) {if(x<2) return false;for(int i2;i<x/i;i){if(x%i0) return false;}return true; } signed main() {cin>&g…

Git学习笔记1

任务要求&#xff1a; 1、使用git提交代码到仓库&#xff1b; 2、实现自动代码发布系统&#xff1b; 1、了解DevOps的发展历程和思想&#xff1b; 2、学会git版本控制&#xff1b; 3、会使用github公有仓库和gitlab私有仓库&#xff1b; 4、了解CI/CD&#xff1b; 5、使用…

svn(乌龟svn)和SVN-VS2022插件(visualsvn) 下载

下载地址: https://www.visualsvn.com/visualsvn/download/

Go的error接口

从本书的开始&#xff0c;我们就已经创建和使用过神秘的预定义error类型&#xff0c;而且没有解释它究竟是什么。实际上它就是interface类型&#xff0c;这个类型有一个返回错误信息的单一方法&#xff1a; type error interface { Error() string } 创建一个error最简单的方…

cutree 算法

传播 ​ 由于块与块之间具有参考关系&#xff0c;提升被参考块的质量&#xff0c;可以改善后续参考块的质量 ​ Pn1帧中CU0,1完全参考Pn的CU1,1。且Pn1帧中CU0,1块帧内预测和帧间预测的代价分别为 c x , y n 1 ( 0 , 0 ) c_{x,y}^{n1}(0,0) cx,yn1​(0,0)和 c x , y n 1 ( d…

vue获取本地缓存并转为json格式

场景 要求获取当前登录用户id&#xff0c;传入后台去筛选属于该用户的数据&#xff1b; 当前登录用户信息一般会在本地存储中&#xff0c;有些则是在session中&#xff0c;此处只对本地存储做讨论&#xff1b; 本地缓存的用法 1 存储数据 localStorage.setltem(userId,"…

【版本控制】Github和Gitlab同时使用ssh

前言 最近在使用 WSL 时会同时用到 GitHub和 Gitlab &#xff0c;因此与传统配置 ssh 方式有些不一样的地方&#xff0c;这里特别记录一下 本地生成公私密钥 首先确保把之前的 ssh 信息清除&#xff0c;也可以将整个 ~/.ssh 目录删除 rm -rf ~/.ssh/*我们分别生成 Github 和…

Bigemap如何添加谷歌历史影像

工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 很多粉丝私信都在问怎么才可以看到谷歌的历史影像&#xff0c;其实这个图源目前是没有对大陆网络ip进行开放&#xff0c;所以如果需要查看&#xff0c;也是需要看你当前…

阿里云产品试用系列-Serverless 应用引擎 SAE

Serverless 应用引擎 SAE&#xff08;Serverless App Engine&#xff09;是一个全托管、免运维、高弹性的通用 PaaS平台。SAE 支持 Spring Boot、Spring Cloud、Dubbo、HSF、Web 应用和 XXL-JOB、ElasticJob任务的全托管&#xff0c;零改造迁移、无门槛容器化、并提供了开源侧诸…

【JAVA-Day23】Java反射的五大神奇妙用,令人惊叹

Java反射的五大神奇妙用&#xff0c;令人惊叹 Java反射的五大神奇妙用&#xff0c;令人惊叹摘要引言一、什么是反射?一、什么是反射?1.1 为什么需要反射?1.1.1 动态加载类1.1.2 序列化和反序列化1.1.3 框架和库开发 1.2 反射基础 二、类2.1 类完整路径2.2 包路径2.3 类名2.4…