在Django5中使用Websocket进行通信

Docker安装Redis

docker run --restart=always -p 6379:6379 --name redis -d redis:7.0.12  --requirepass zhangdapeng520

安装依赖

参考文档:https://channels.readthedocs.io/en/latest/installation.html

pip install "channels[daphne]"

展示聊天页面

新增:chat/templates/chat/index.html

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"/><title>Chat Rooms</title>
</head>
<body>请输入您要进入的房间名称<br><input id="room-name-input" type="text" size="100"><br><input id="room-name-submit" type="button" value="进入房间"><script>// 输入框聚焦document.querySelector('#room-name-input').focus();// 输入框按下enter键,相当于点击提交按钮document.querySelector('#room-name-input').onkeyup = function(e) {if (e.key === 'Enter') {document.querySelector('#room-name-submit').click();}};// 提交按钮点击document.querySelector('#room-name-submit').onclick = function(e) {// 获取房间名称const roomName = document.querySelector('#room-name-input').value;// 重定向到指定房间window.location.pathname = '/chat/' + roomName + '/';};</script>
</body>
</html>

修改:chat/views.py

from django.shortcuts import renderdef index(request):"""首页路由"""return render(request, "chat/index.html")

新增:chat/urls.py

from django.urls import pathfrom . import viewsurlpatterns = [path("", views.index, name="index"),
]

修改:Django5Websocket/urls.py

from django.contrib import admin
from django.urls import include, pathurlpatterns = [path("chat/", include("chat.urls")),path("admin/", admin.site.urls),
]

启动服务,浏览器访问:http://localhost:8000

建立Websocket服务

新增:chat/consumers.py

import jsonfrom channels.generic.websocket import WebsocketConsumerclass ChatConsumer(WebsocketConsumer):"""Websocket通信类"""def connect(self):"""建立连接"""self.accept()def disconnect(self, close_code):"""断开连接"""passdef receive(self, text_data):"""接收消息"""# 转换为JSON类型text_data_json = json.loads(text_data)# 提取消息message = text_data_json["message"]# 重新发送JSON文本消息self.send(text_data=json.dumps({"message": message}))

新增:chat/routing.py

from django.urls import re_pathfrom . import consumerswebsocket_urlpatterns = [# 定义websocket的连接re_path(r"ws/chat/(?P<room_name>\w+)/$", consumers.ChatConsumer.as_asgi()),
]

修改:Django5Websocket/wsgi.py

import os
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from django.core.asgi import get_asgi_application
from chat.routing import websocket_urlpatternsos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Django5Websocket.settings')django_asgi_app = get_asgi_application()
application = ProtocolTypeRouter({"http": django_asgi_app,"websoket": AllowedHostsOriginValidator(AuthMiddlewareStack(URLRouter(websocket_urlpatterns)))
})

修改:chat/views.py

from django.shortcuts import renderdef index(request):"""首页路由"""return render(request, "chat/index.html")def room(request, room_name):"""房间路由"""return render(request, "chat/room.html", {"room_name": room_name})

新增:chat/templates/chat/room.html

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"/><title>Chat Room</title>
</head>
<body>
{#聊天日志#}
<textarea id="chat-log" cols="100" rows="20"></textarea><br>
{#消息输入框#}
<input id="chat-message-input" type="text" size="100"><br>
{#提交按钮#}
<input id="chat-message-submit" type="button" value="Send">
{#房间名称#}
{{ room_name|json_script:"room-name" }}
<script>// 提取房间名称const roomName = JSON.parse(document.getElementById('room-name').textContent);// 创建websocket连接const chatSocket = new WebSocket('ws://'+ window.location.host+ '/ws/chat/'+ roomName+ '/');// 接收消息chatSocket.onmessage = function (e) {// 解析接收到的消息const data = JSON.parse(e.data);// 输出到聊天日志记录document.querySelector('#chat-log').value += (data.message + '\n');};// 关闭websocketchatSocket.onclose = function (e) {console.error('聊天websocket连接已经被关闭');};// 消息输入框自动聚焦document.querySelector('#chat-message-input').focus();// 消息输入框的enter事件document.querySelector('#chat-message-input').onkeyup = function (e) {if (e.key === 'Enter') {document.querySelector('#chat-message-submit').click();}};// 提交按钮的点击事件document.querySelector('#chat-message-submit').onclick = function (e) {// 获取要输入的消息const messageInputDom = document.querySelector('#chat-message-input');const message = messageInputDom.value;// 发送消息chatSocket.send(JSON.stringify({'message': message}));// 清空输入框内容messageInputDom.value = '';};
</script>
</body>
</html>

迁移数据:

python manage.py migrate

Docker安装Redis

安装Redis:

docker run --restart=always -p 6379:6379 --name redis -d redis:7.0.12  --requirepass zhangdapeng520

安装依赖:

pip install channels_redis

配置信息:

ASGI_APPLICATION = 'Django5Websocket.asgi.application'
CHANNEL_LAYERS = {"default": {"BACKEND": "channels_redis.core.RedisChannelLayer","CONFIG": {"hosts": ["redis://:zhangdapeng520@127.0.0.1:6379/0"],},},
}

启动服务

启动服务,浏览器访问:http://localhost:8000/chat/test/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/588551.shtml

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

相关文章

js 常用方法举例说明50个

js 常用方法举例说明50个 JavaScript是一门广泛应用于Web开发的编程语言&#xff0c;它提供了丰富的方法来操作数据、处理事件、操作DOM等。以下是50个常用的JavaScript方法&#xff0c;每个方法都附有简单的说明和示例&#xff1a; getElementById&#xff1a; 通过元素的ID获…

【链表OJ—链表的回文结构】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

前端基础:Vue搞笑白话文(工作之余瞎写)

1、data:{}与data(){return{}}这两个是个什么鬼&#xff1f; vue实例 new Vue({el:#app,data:{name:李四}}) 组件实例 const aaa Vue.extent({data(){return {name:}} }) 为什么Vue实例可以那么写而组件实例就不行了&#xff1f;原因就是因为在底层原理上&#xff0c;组件…

华为电脑的IP地址:如何找到并管理?

​在现代科技的高速发展中&#xff0c;华为电脑已经成为了人们生活和工作中必不可少的重要工具。然而&#xff0c;对于很多用户来说&#xff0c;IP地址却是一个颇具挑战性的问题。在本文中&#xff0c;我们将会详细探讨华为电脑的IP地址在哪里找&#xff0c;并提供一些建议和技…

k8s集群通过helm部署skywalking

1、安装helm 下载脚本安装 ~# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 ~# chmod 700 get_helm.sh ~# ./get_helm.sh或者下载包进行安装 ~# wget https://get.helm.sh/helm-canary-linux-amd64.tar.gz ~# mv helm …

python使用openpyxl为excel模版填充数据,生成多个Sheet页面

目标&#xff1a;希望根据一个给定的excel模版&#xff0c;生成多个Sheet页面&#xff0c;比如模版&#xff1a; 示例程序 import openpyxlexcel_workbook openpyxl.load_workbook("模版.xlsx") for _i in range(3): # 比如填充3个页面# 复制模版sheet页&#x…

Python单元测试模块Unittest测试代码简单示例

一、测试项目目录结构&#xff1a; 创建一个项目&#xff0c;目录中有Calculator.py与Demo_test_three.py两个源码文件。Calculator.py是被测试的代码&#xff0c;Demo_test_three.py是执行测试的代码。本示例建了两级目录。一级目录名称&#xff1a;my_unittest;二级目录名称…

基于NXP I.MX8 + Codesys的工业软PLC解决方案

全新i.MX 8M Plus是一个混合人工智能SoC&#xff0c;将先进的嵌入式SoC与最新的人工智能/机器学习硬件NPU技术相结合&#xff0c;通过神经网络加速器&#xff0c;为边缘计算提供强大的机器学习能力&#xff0c;是i.MX 8M Plus一个最为突出的优势。WEC-IMX8P核心板特别适合在机器…

SpringBoot+拦截器(Interceptor)

记录一下SpringBoot的拦截器(Interceptor)使用 拦截器(Interceptor)是AOP面向切面编程的思想来实现的&#xff0c;对于只写代码的来说&#xff0c;具体如何实现不需要多关心&#xff0c;只需要关心如何去使用&#xff0c;会用在那些地方。 当http请求进入Springboot应用程序后…

GBASE南大通用-一文读懂如何用Zabbix监控GBase 8c

南大通用GBase 8c是基于openGauss3.0构建的一款多模多态的分布式数据库&#xff0c;支持行存、列存、内存等多种存储模式和单机、主备式、分布式等多种部署形态&#xff0c;具备多模多态、极高性能、极高可用、极致弹性、极致安全等特性&#xff0c;为金融、政务、互联网等行业…

CGAL的主成分分析

此软件包提供了分析二维和三维对象集的功能。它提供了所有有界对象的轴对齐边界框、质心和主成分分析的计算&#xff0c;以及加权点集的重心。请注意&#xff0c;与大多数CGAL软件包不同&#xff0c;该软件包使用近似方法&#xff08;特别是线性最小二乘拟合&#xff09;&#…

数据采集遇到验证码校验的一般破解方式简述

背景 百度自动采集是一种高效的数据采集方法&#xff0c;但是在采集过程中经常会遇到图片验证码的问题&#xff0c;从而导致采集失败。那么有没有什么方法可以绕过图片验证呢&#xff1f;本文将为您详细介绍。 解决方案 一、使用OCR技术识别验证码 OCR技术可以识别图片中的…

vue实现滑动切换:切换选项时滑块有滑动过渡的效果

效果图 思路&#xff1a; 1. 高亮的色块是独立的一个盒子&#xff0c;需要插入当前激活的内容用来撑开色块盒子的宽度&#xff0c;这样色块的宽度就会和当前激活的内容宽度一致&#xff0c;色块的字体颜色设置透明即可 2. 色块滑动的距离是读当前激活元素的offsetLeft&#x…

Python进行网页爬取,使用Python中的那些库和工具。

要使用Python进行网页爬取&#xff0c;您可以使用Python中的一些库和工具来实现。 常用的Python库和工具包括&#xff1a; Requests&#xff1a;用于发送HTTP请求和获取网页内容。Beautiful Soup&#xff1a;用于解析HTML和XML文档&#xff0c;并从中提取数据。Scrapy&#x…

【上分日记】377场周赛(图论 + dp)

文章目录 前言正文1.2975. 移除栅栏得到的正方形田地的最大面积2.2976. 转换字符串的最小成本 I3.2977. 转换字符串的最小成本 II 总结后文 前言 本场周赛&#xff0c;后两题都涉及到了图论的最短路径&#xff08;克鲁斯卡尔算法&#xff09;的知识&#xff0c;恰巧又没学过&am…

文献阅读:LoRA: Low-Rank Adaptation of Large Language Models

文献阅读&#xff1a;LoRA: Low-Rank Adaptation of Large Language Models 1. 文章简介2. 方法介绍3. 实验 & 结论 1. 基础实验 1. Bert系列模型2. GPT系列模型 2. 消解实验 1. 作用矩阵考察2. 中间维度考察3. 扰动程度分析 4. 总结 & 思考 文献链接&#xff1a;htt…

SLAM学习入门--机器学习

文章目录 机器学习逻辑回归&#xff08;LR&#xff09;基本原理为什么 LR 要使用 sigmoid 函数&#xff1f;LR 可以用核函数么&#xff1f;为什么 LR 用交叉熵损失而不是平方损失&#xff1f;LR 能否解决非线性分类问题&#xff1f;LR为什么要离散特征&#xff1f;逻辑回归是处…

Linux文件系统结构及相关命令2 什么是Shell? help cd cd的用法 ls 的用法

Shell 是一种用于与操作系统进行交互的命令行解释器。它是用户与操作系统内核之间的接口&#xff0c;接受用户的命令并将其传递给操作系统进行执行。 在大多数的 Unix-like 操作系统&#xff08;如 Linux 和 macOS&#xff09;以及类 Unix 系统中&#xff0c;Shell 是默认的命…

10 HXCodec

前言 这个主要是提供了日常的相关 编码解码体系 的工具包, 依赖于fastjson 和 netty-all 里面主要包含了一些 摘要的生成, base64编码解码, ByteBuf操作api, Des编码解码, 文件操作, 十六进制操作, io操作, md5操作, 属性操作, rsa操作, socket操作 对象 序列化为字节序列, …

Qlib从入门到精通

前面谈到了简单的一个示例代码&#xff0c;实际上里面的策略源码和模型回测源码都需要好好了解&#xff0c;他这个回测系统和我之前用到的回测策略代码有不一样的地方&#xff0c;作为一个量化策略攻城狮&#xff0c;掌握源码是基本的技能。 Qlib内置了A股、美股两个市场的历史…