在Django5中使用Websocket进行通信

这篇具有很好参考价值的文章主要介绍了在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 render


def index(request):
    """首页路由"""
    return render(request, "chat/index.html")

新增:chat/urls.py

from django.urls import path

from . import views


urlpatterns = [
    path("", views.index, name="index"),
]

修改:Django5Websocket/urls.py

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("chat/", include("chat.urls")),
    path("admin/", admin.site.urls),
]

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

建立Websocket服务

新增:chat/consumers.py

import json

from channels.generic.websocket import WebsocketConsumer


class ChatConsumer(WebsocketConsumer):
    """Websocket通信类"""
    def connect(self):
        """建立连接"""
        self.accept()

    def disconnect(self, close_code):
        """断开连接"""
        pass

    def 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_path

from . import consumers

websocket_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_urlpatterns

os.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 render


def 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');
    };

    // 关闭websocket
    chatSocket.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/文章来源地址https://www.toymoban.com/news/detail-771605.html

到了这里,关于在Django5中使用Websocket进行通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 利用Websocket进行前后端通信

    一、websocket是什么 是一种基于TCP协议的网络通信技术,它提供了一个持久的、全双工的通信通道,可以在客户端和服务器之间进行实时的双向通信。 特点:WebSocket允许服务器主动向客户端推送数据,而不需要客户端发送请求。这种实时通信的特性使得WebSocket非常适合在Web应

    2024年02月12日
    浏览(25)
  • 一周学会Django5 Python Web开发-Django5路由定义

    锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计22条视频,包括:2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~、第2讲 Django5安装、

    2024年02月19日
    浏览(32)
  • Python使用flask框架与前端建立websocket链接,并进行数据交互

    后端采用的框架为flask,前端用的flask自带的html编写,实现的功能为:前后端建立websocket链接并进行数据交互 一、编写一个flask后端服务 常规创建方式就可以,创建一个flask服务。声明一个websocket实例,以websocket的方式启动这个服务。 安装相关依赖: 声明应用和websocket实例

    2024年04月11日
    浏览(35)
  • 【WebSocket】前端使用WebSocket实时通信

    最近写项目,需要实现消息通知和实时聊天的功能,就去了解了一些关于websocket的知识,总结如下。 WebSocket 是一种在 Web 应用中实现实时通信的协议。与传统的 HTTP 请求不同,WebSocket 连接在客户端和服务器之间建立一个 持久性 的 双向通信管道 ,使得数据可以在连接打开后

    2024年02月11日
    浏览(25)
  • Django使用WebSocket

    实现一个系统,20 个用户同时打开网站,呈现出来一个群聊界面 解决方案 轮询 :让 浏览器每隔2s向后台 发送一次请求,缺点:延迟,请求太多网站压力大 长 轮询: 客户端向服务端 发送请求,服务器最多宕20s,一旦有数据接入,就立即返回。数据的响应没有延迟时间。

    2024年01月17日
    浏览(27)
  • Django3框架-(2)-[使用websocket]:使用channels实现websocket,配置和项目实际使用

    依赖包: 项目目录结构: study_websocket         --study_websocket                 --__init__.py                 --settings.py                 --asgi.py                 --wsgi.py                 --urls.py         --chat                 --routing

    2024年01月18日
    浏览(29)
  • webSocket及使用webSocket实现实时聊天通信

    webSocket在开始的时候依旧使用的是http协议,只不过后面保持tcp持久链接,是一种全双工通信。webSockets和http很像,它的请求url用的是ws、wss,对应http、https 初始化 npm init -y 安装ws依赖 npm i --save ws 写服务器代码 服务器启动 node server.js 配置前端代码,即告诉浏览器这个请求不要

    2023年04月11日
    浏览(32)
  • Python web实战之Django 的 WebSocket 支持详解

     :Python, Django, WebSocket, Web   如何使用 Django 实现 WebSocket 功能?本文将详细介绍 WebSocket 的概念、Django 的 WebSocket 支持以及如何利用它来创建动态、响应式的 Web 应用。   1.1 什么是 WebSocket? 在 Web 开发中,当我们需要实现实时交互、即时通信或实时更新数据的功能时

    2024年02月12日
    浏览(31)
  • 远程服务和web服务和前端,三方通过socket和websocket进行双向通信传输数据

    1. 什么是socket? 在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 2. 什么是websocket? WebSocket是一种网络通信协议,是HTML5新增的特性,

    2024年02月15日
    浏览(45)
  • django 使用channels 搭建websocket聊天程序

     channels官方文档:Django Channels — Channels 4.0.0 documentation  效果如下:  主要实现功能 基于Django的认证的群聊 具体实现 当建立websocket的时候,建立之前是http消息,我们可以拿到http消息里面的cookie等信息进行认证,本次使用的是jwt认证,因此需要在建立的连接的时候,将jwt认

    2024年02月12日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包