django基于channels实现群聊功能(代码片段)

yafeng666 yafeng666     2023-04-03     508

关键词:

django基于channels实现群聊功能

"""
补充
我们用pycharm创建的django项目会自动帮你创建templates文件夹并且是全局的

其实除了可以在全局创建模版文件夹之外,还可以做到更加的细化 就是在每一个应用下创templates模版文件夹

如果出现多个应用和全局都有模版文件夹的情况,那么会优先查找全局
如果全局没有,则按照配置文件中注册app的顺序的从上往下一次查找每一个应用下templates
INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘app01.apps.App01Config‘,
]

每一个应用都可以有自己的urls.py(路由分发),views.py,templates,static
"""

配置完成后同时支持http和websocket的原因(源码)

class ProtocolTypeRouter:
    """
    Takes a mapping of protocol type names to other Application instances,
    and dispatches to the right one based on protocol name (or raises an error)
    """
    def __init__(self, application_mapping):
        self.application_mapping = application_mapping
        if "http" not in self.application_mapping:
            self.application_mapping["http"] = AsgiHandler

前期三步配置完成后继续书写以下代码

from channels.routing import ProtocolTypeRouter,URLRouter
from django.conf.urls import url
from app01 import consumers

application = ProtocolTypeRouter(
    ‘websocket‘:URLRouter([
        # websocket相关的路由
        url(r‘^chat/‘,consumers.ChatConsumer)
    ])
)
from channels.generic.websocket import WebsocketConsumer


class ChatConsumer(WebsocketConsumer):
    def websocket_connect(self, message):
        """客户端请求建立链接时 自动触发"""
        pass


    def websocket_receive(self, message):
        """客户端发送数据过来  自动触发"""
        pass


    def websocket_disconnect(self, message):
        """客户端断开链接之后  自动触发"""
        pass
"""
http协议
	index路径		index视图函数
	访问:浏览器窗口直接输入的地址的

websocket协议
	chat路径		ChatConsumer视图类
	访问:new WebSocket对象访问
"""

方法总结

# 后端  3个
class ChatConsumer(WebsocketConsumer):
    def websocket_connect(self, message):
        """客户端请求建立链接时 自动触发"""
        self.accept()  # 建立链接  并且自动帮你维护每一个客户端

    def websocket_receive(self, message):
        """客户端发送数据过来  自动触发"""
        # print(message)  # message = ‘type‘: ‘websocket.receive‘, ‘text‘: ‘hello world!‘
        text = message.get(‘text‘)  # 真正的数据
        # 给客户端发送消息
        self.send(text_data=‘介绍女朋友‘)


    def websocket_disconnect(self, message):
        """客户端断开链接之后  自动触发"""
        raise StopConsumer()


# 前端  4个
var ws = new WebSocket(‘ws://127.0.0.1:8000/chat/‘);

    // 1 握手环节验证成功之后 自动触发  onopen
    ws.onopen = function () 
        console.log(‘握手成功‘)
    

    // 2 给服务端发送消息  send
    function sendMsg() 
        ws.send($(‘#txt‘).val())
    

    // 3 一旦服务端有消息 自动触发  onmessage
    ws.onmessage = function (args) 
        // console.log(args)  // args是一个对象
        // 获取发送的数据
        console.log(args.data)
    

    // 4 断开链接之后  自动触发  onclose
    ws.onclose = function () 
        ws.close()
    

群聊功能

我们是通过自己维护一个列表存储链接对象的方式完成了简易版本的群聊

其实channels给你提供了一个用于做群聊的模块,该模块可以实现真正的分组聊天

该模块就是channel-layers

java基于socket实现聊天群聊敏感词汇过滤功能(代码片段)

首先的话,这个代码主要是我很久以前写的,然后当时还有很多地方没有理解,现在再来看看这份代码,实在是觉得丑陋不堪,想改,但是是真的改都不好改了…所以,写代码,规范真的很重要。... 查看详情

8.基于netty实现群聊,心跳检测(代码片段)

...po出了Unpooled创建缓冲区的代码示例;3.本文示例代码基于netty实现以下功能:群聊客户端及服务器;心跳检测;【1】Unpooled创建缓冲区Unpooled定义:是Netty提供的一个专门用来操作缓冲区(即Netty 查看详情

网络i/o编程模型16netty框架实现的群聊系统(代码片段)

...,离线,并实现消息转发功能。客户端:通过channel可以无阻塞发送消息给其他所用用户,同时可以接受其他用户发送的消息(有服务器转发得到)2.采用思路:使用netty的非阻塞网络机制二代码实现2.1... 查看详情

django使用channels实现webssh网页终端,实现ssh堡垒机雏形

...请点击我的博客查看,欢迎来访。本教程基于《Django使用Channels实现WebSocket消息通知功能》xterm.js:前端模拟shell终端的一个库,当用户每输入一个键,就向后端发送该数据paramiko:Python下对ssh2封装的一个库,可以使用他来远程连... 查看详情

如何通过 Django Channels 实现视频通话?

】如何通过DjangoChannels实现视频通话?【英文标题】:HowtoimplementvideocallsoverDjangoChannels?【发布时间】:2020-05-0717:29:11【问题描述】:我想创建一个允许用户进行视频通话的应用。我发现了一些见解here,但不幸的是,答案既没有... 查看详情

django——博客项目(代码片段)

博客项目目前的目标是构建一个基于Django的前后端完整的博客系统,首先对项目流程整理如下: 1. 分析需求1.1. 1.基于用户认证组件和Ajax实现登录验证1.2. 基于forms组件和Ajax实现注册功能1.3. 设计系统首页(文... 查看详情

django集成jwt基于token凭证方式,实现前后端分离(代码片段)

功能简介业务需求:今天想尝试为Django添加安全验证框架,但是看了相关Django涉及Authentication模块的配置,过于繁琐且不适合当前前后端分离趋势发展,所以放弃Django自带安全模块,使用Django集成Jwt基于Token凭... 查看详情

使用nio实现一个简易的群聊和单聊(代码片段)

服务端:接收客户端发送的消息,并进行转发。packagesocket.demo2;importjava.io.IOException;importjava.net.InetSocketAddress;importjava.net.ServerSocket;importjava.nio.ByteBuffer;importjava.nio.channels.*;importjava.nio.chars 查看详情

4.基于nio的群聊系统(代码片段)

【README】1.本文总结自B站《netty-尚硅谷》,很不错;2.文末有错误及解决方法;【1】群聊需求1)编写一个NIO群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞)2)实现多人群聊;3... 查看详情

代码发布5发布流程,基于channel-layers实现群发功能,节点图标的创建,节点状态动态改变(代码片段)

...效果(channle-layers)channle-layers基本使用配置文件中配置参数CHANNEL_LAYERS=‘default‘:‘BACKEND‘:‘channels.layers.InMemoryChannelLayer‘如何获取无名有名分组中url携带的参数(因为此处用类,无法像方法获得有名分 查看详情

django框架之forms组件(基于注册功能)(代码片段)

1、注册功能分析注册功能1.渲染前端标签获取用户输入>>>渲染标签2.获取用户输入传递到后端校验>>>校验数据3.校验未通过展示错误信息>>>展示信息2、使用forms组件实现注册功能1.校验数据校验规则:form组件... 查看详情

基于django的视频点播网站开发-step3-注册登录功能(代码片段)

用户注册登录是一个网站的基本功能,django对这部分进行了很好的封装,我们只需要在django的基础上做些简单的修改就可以达到我们想要的效果。在本讲中,我们会用到user中的用户授权方面的一些函数,还会对django中的user进行... 查看详情

Django Channels 2:两种身份验证方法

】DjangoChannels2:两种身份验证方法【英文标题】:DjangoChannels2:twoauthenticationmethods【发布时间】:2019-05-1420:32:28【问题描述】:如何为我的django频道应用程序实现多种身份验证方法?我的意思是,我有一个基于令牌的身份验证和... 查看详情

javasocket编程实现群聊(超详细)(代码片段)

Javasocket编程实现群聊最终效果文末有完整代码,创作不易,点个赞再走吧~客户端之间的交流有人退出群聊时,减少在线人数实现流程1、项目结构即原理分析功能实现多客户之间聊天实时统计在线人数图形化界面创建... 查看详情

django第四课基于django超市订单管理系统开发(代码片段)

概念本文在上一文之上,针对管理员,经理,普通员工身份的用户操作订单管理模块功能。功能实现该功能也是业务功能模块,管理员不具备操作权限,普通员工需要对超市所合作的供应商进行进货,因此... 查看详情

基于django的在线考试系统(代码片段)

概述基于Django的在线考试系统,适配电脑端,可以实现出题,答题,排行榜,倒计时等等等功能详细代码下载:http://www.demodashi.com/demo/13923.html项目目录结构:account为扩展的Django用户模块analysis为用户答题分析模块api为接口路由busi... 查看详情

django第三课基于django图书借阅管理网站平台(代码片段)

概念本文在上一篇文章之上,完成借阅图书功能,查看借阅记录功能,归还图书,查看历史借阅记录,删除历史借阅记录等等借阅图书功能实现当前学生查阅图书的时候,如果当前学生没有借阅过该书࿰... 查看详情

django第二课基于django超市订单管理系统开发(代码片段)

概念本文在上一文之上,针对管理员,经理,普通员工身份的用户操作用户管理模块功能。功能实现1.普通员工登录系统后,对于用户管理模块不具备操作其他用户信息的权限。因此当普通员工登录后,弹出对... 查看详情