使用django+websocket+redis+channels实现简易聊天室

1.创建一个django项目

从存储项目的文件夹进入cmd命令行终端,输入以下命令创建chatroom项目

django-admin startproject chatroom

然后再进入项目文件夹,打开cmd命令行终端,输入以下命令创建chat应用

python manage.py startapp chat

2.安装所需模块

channels的功能必须依赖于redis数据库,除了安装channels之外,还需安装channels_redis模块,我们使用pip指令分别安装channels和channels_redis,指令如下:

pip install channels
pip install channels_redis
#channels的功能依赖模块
pip install pypiwin32

3.在django中配置channels

(1)在项目应用chat里新建urls.py文件

(2)在chatroom文件夹里创建文件consumers.py和routing.py,文件名可以自行命名

(3)在项目应用chat里新建templates文件夹,在templates文件夹里创建模板文件chat.html和room.html,项目结构如下:

(4)执行整个项目的数据迁移,因为channels需要使用django内置的会话session机制,用于区分和识别每个用户的身份信息

(5)在django的settings.py里将第三方功能应用channels和chat添加到chatroom,配置如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'channels',
    'chat'
]

(6)由于channels的功能依赖与redis数据库,因此还需在settings.py里设置channels的功能设置,配置信息如下:

ASGI_APPLICATION = 'chatroom.routing.application'
CHANNEL_LAYERS={
    'default':{
        'BACKEND':'channels_redis.core.RedisChannelLayer',
        'CONFIG':{
            "hosts":[('127.0.0.1',6379)],
        },
    },
}

(7)功能配置CHANNEL_LAYERS用于设置redis数据库的连接方式,ASGI_APPLICATION指向chatroom的routing.py定义的application对象,该对象把django与channels建立连接,打开chatrooom的routing.py添加如下内容:

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter
from channels.routing import URLRouter
from .urls import websocket_urlpatterns
application = ProtocolTypeRouter({
    'websocket':AuthMiddlewareStack(
        URLRouter(
            websocket_urlpatterns
        )
    ),
})

(8)在chatroom的urls.py中定义路由对象urlpatterns和websocket_urlpatterns,代码如下:

from django.urls import path,include
from .consumers import ChatConsumer

urlpatterns = [
    path("",include(("chat.urls","chat"),namespace="chat"))
]

websocket_urlpatterns=[
    #使用同步方式实现
    #path('ws/chat//',ChatConsumer),
    #如果使用异步方式实现,路由的视图必须调用as_asgi()
    path('ws/chat//',ChatConsumer.as_asgi()),
]

(9)在chatroom的consumers.py中定义视图类ChatConsumer,代码如下:

from channels.generic.websocket import AsyncWebsocketConsumer
import json

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        print("一个客户端连接了服务器")
        self.room_name=self.scope['url_route']['kwargs']['room_name']
        self.room_group_name='chat_%s' % self.room_name
        #join room group
        await self.channel_layer.group_add(
            self.room_group_name,
            self.channel_name
        )
        await  self.accept()

    async def disconnect(self, code):
        # leave room group
        await self.channel_layer.group_discard(
            self.room_group_name,
            self.channel_name
        )
        print("一个客户端断开了连接")

    # receive message from websocket
    async def receive(self, text_data=None, bytes_data=None):
        text_data_json=json.loads(text_data)
        message=text_data_json["message"]
        # send message to room group
        await self.channel_layer.group_send(
            self.room_group_name,
            {
                'type':'chat_message',
                'message':message
            }
        )

    # receive message from room group
    async def chat_message(self,event):
        message=event['message']
        # send message to websocket
        await self.send(text_data=json.dumps({
            'message':message
        }))

4.web在线聊天功能

(1)在项目应用chat的urls.py中分别定义路由newChat和room,代码如下:

from django.urls import path
from .views import *

urlpatterns = [
    #用于开启新的聊天室
    path('',newChat,name="newChat"),
    #创建聊天室
    path('/',room,name="room")
]

(2)在chat的views.py中定义视图,代码如下:

from django.shortcuts import render

#用于创建或进入聊天室
def newChat(request):
    return render(request,'chat.html',locals())

#创建聊天室
def room(request,room_name):
    return render(request,'room.html',locals())

(3)编写chat.html模板文件


    Title

请输入聊天室名称

    document.querySelector('#input').focus();
    document.querySelector('#input').onkeyup=function (e){
        if (e.keyCode===13){
            document.querySelector('#submit').click();
        }
    };
    document.querySelector('#submit').onclick=function (e){
        var roomName=document.querySelector('#input').value;
        window.location.pathname='/'+roomName + '/';
    }

(4)编写room.html模板文件


    聊天室{{ room_name }}

    var roomName='{{ room_name }}';
    var chatSocket=new WebSocket(
        'ws://' + window.location.host+'/ws/chat/' + roomName +'/'
    );

    {#将chat发送的数据显示在多行文本输入框中#}
    chatSocket.onmessage=function (e){
        var data=JSON.parse(e.data);
        var message=data['message'];
        document.querySelector('#chat_log').value+=(message +'\n');
    };

    {#关闭网页与chat的Channels连接#}
    chatSocket.onclose=function (e){
        console.error('Chat socket closed unexpectedly');
    };

    document.querySelector('#input').focus();
    document.querySelector('#input').onkeyup=function (e){
        if (e.keyCode===13){
            document.querySelector('#submit').click();
        }
    };

    {#网页向chat的channels发送数据#}
    document.querySelector('#submit').onclick=function (e){
        var messageInputDom = document.querySelector('#input');
        var message=messageInputDom.value;
        chatSocket.send(JSON.stringify({
            'message':message
        }));
        messageInputDom.value='';
    }

5.测试聊天室功能

运行项目,打开谷歌浏览器并访问127.0.0.1:8000,在文本输入框输入聊天室名称,并单击进入,如下图所示:

当成功创建聊天室room0001后,打开另一个浏览器访问127.0.0.1:8000/room0001,聊天室已有两位用户在线,然后使用谷歌浏览器发送消息,发现在另一浏览器可以实时看到消息内容,如下图所示:

Original: https://www.cnblogs.com/minqiliang/p/16548465.html
Author: minqiliang
Title: 使用django+websocket+redis+channels实现简易聊天室

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/809722/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 坐标轴的定制

    1.坐标轴概述:在绘制图表的过程中,matplotlib会根据所绘图表的类型决定是否使用坐标系,或者显示哪种类型的坐标系。例如,饼图无坐标系,雷达图需使用极坐标系,折线图需使用直角…

    Python 2023年9月3日
    049
  • 机器学习之逻辑回归Logistic Regression(python代码实现)

    逻辑回归(Logistic Regression) 逻辑回归是一个非常经典的算法,用于解决分类问题的机器学习方法,用于估计某种事物的可能性,其有着简单、可并行化、可解释强的特点。逻…

    Python 2023年8月1日
    053
  • 用Python实现简单的人脸识别,10分钟搞定!(附源码)

    前言 让我的电脑认识我,我的电脑只有认识我,才配称之为我的电脑! 今天,我们用Python实现简单的人脸识别技术! Python里,简单的人脸识别有很多种方法可以实现,依赖于pyt…

    Python 2023年10月8日
    056
  • 注册功能页面的搭建

    思路分析 注册页面需要对用户提交的数据进行校验,并且需要对用户输入错误的地方进行提示! 所有我们需要使用forms组件搭建注册页面! 平时我们书写form是组件的时候是在views…

    Python 2023年10月31日
    038
  • flask介绍与简单操作

    一、介绍 Flask的核心在于werkzeug(路由模块),Jinja2模板引擎 类比Django:路由、模板、orm Flask要完成功能,依赖于丰富的插件 补充:Django与…

    Python 2023年8月11日
    041
  • python的 numpy库学习总结和介绍(超详细)模块

    目录 前言 numpy是什么? 一、创建数据容器 1.np.array(),通过传递一个列表,元祖来创建 2.np.zeros(),np.ones(),np.empty(),np….

    Python 2023年8月24日
    061
  • 什么是Scrum?Scrum的核心要点和精髓

    有点长,期望你能通过本文彻底了解 Scrum。 上一篇文章《研发效能组织能力建设之特性团队FeatureTeam(上)》,我们介绍了一个非常有意思且高效的组织模式-特性团队。我们首…

    Python 2023年10月19日
    040
  • 基于lio-sam框架,教你如何进行回环检测及位姿计算

    摘要:本篇主要解析lio-sam框架下,是如何进行回环检测及位姿计算的。 图优化本身有成形的开源的库,例如 g2o ceres gtsam lio-sam 中就是 通过 gtsam…

    Python 2023年10月25日
    039
  • scrapy_爬虫

    命令行下载jar包 pip install xxxxxx -i http://pypi.douban.com/simple –trusted-host pypi.douban.c…

    Python 2023年10月1日
    058
  • Python:朋友圈配图,我承包了

    Original: https://www.cnblogs.com/123456feng/p/16076916.htmlAuthor: 蚂蚁ailingTitle: Python:…

    Python 2023年11月9日
    037
  • scrapy_selenium 使用 SeleniumRequests

    文章目录 一、scrapy_selenium安装 二、配置scrapy * 1.修改settings 2.spider SeleniumRequests的参数 – 1….

    Python 2023年10月1日
    041
  • Python数据分析之股票双均线策略制定

    Python数据分析之股票双均线策略制定 需求:双均线策略制定 库 tushare包 预处理数据 df = pd.read_csv(‘./maotai.csv’).drop(lab…

    Python 2023年8月8日
    044
  • 协方差矩阵上机实验

    协方差矩阵上机实验 1.1 题目的主要研究内容 (1)介绍协方差矩阵的定义、计算过程 (2)给出协方差矩阵的具体数据,并运用Python进行上机实现 (3)对两种协方差矩阵计算的结…

    Python 2023年8月29日
    056
  • 华为研究的70个Python练手项目,得不到就毁掉~

    华为研究的70个Python练手项目,得不到就毁掉~ 前言: 不管学习哪门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行。…

    Python 2023年9月24日
    037
  • 盘点 Pandas 中用于合并数据的 5 个最常用的函数!

    作者:阿南 整理:小五 如何在Pandas合并数据,大家肯定都不陌生。 作为一个初学者,我发现自己学了很多,却没有好好总结一下。正好看到一位大佬 Yong Cui 总结的文章,我就…

    Python 2023年8月16日
    067
  • Websocket集群解决方案

    最近在项目中在做一个 消息推送的功能,比如客户下单之后通知给给对应的客户发送 系统通知,这种消息推送需要使用到全双工的 websocket推送消息。 所谓的 全双工表示客户端和服务…

    Python 2023年10月15日
    054
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球