channel

什么是channel?

channel是第三方工具包,对于不支持websocket协议的框架可以借助此包实现websocket

安装

终端安装:

pip3 install channel

pycharm安装:

Project Interprete 搜索  “channel”即可

配置

1、配置 setting.py

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

配置完app后,还要对ASGI_APPLICATION配置:

# 配置 channel
ASGI_APPLICATION = "MiniChat.routing.application"

如果不配置就会报错:

CommandError: You have not set ASGI_APPLICATION, which is needed to run the server.

2.、配置路由

在app下新建routing.py文件,此文件相当于django的url.py

MiniChat/routing.py

from channels.routing import ProtocolTypeRouter, URLRouter
from django.conf.urls import url
from chat import consumers application = ProtocolTypeRouter({
"websocket":URLRouter([ ])
})

3、创建业务处理文件:consumers.py

此文件相当于django中的view.py文件

MiniChat/consumers.py

#!usr/bin/env python
#-*- coding:utf-8 _*-
from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StopConsumer class ChatConsumer(WebsocketConsumer): def websocket_connect(self, message):
"""
客户端发送请求进来,触发此方法
:param message:
:return:
"""
self.accept() def websocket_receive(self, message):
"""
客户端发送消息,触发此方法,并返回数据
:param message:
:return:
"""
self.send() def websocket_disconnect(self, message): """
客户端主动断开链接,触发此方法
:param message:
:return:
"""
# 服务端触发异常 StopConsumer
raise StopConsumer

consumers.py

最终项目目录:

案例:WebChat

基于上面的配置,先创建一个视图:

from django.shortcuts import render

# Create your views here.

def index(request):

    return render(request, "index.html")

然后在app01中创建一个templates包,在这个包中创建一个index.html.再去实现html文件:

Django默认模板查找顺序是从根目录查找,找不到再去app中查找

<div>
<div>
<input type="text" id="txt">
<input type="button" value="send" onclick="sendMsg();">
<input type="button" value="close" onclick="closeConn();">
</div>
<h2>聊天记录</h2>
<div id="content"> </div>
</div>

现在跑一下项目文件,浏览器页面显示:

现在再去完善下html文件

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.0/jquery.min.js"></script>
<script> var ws = new WebSocket("ws://127.0.0.1:8000/chat/"); ws.onopen = function(){
// 客户端验证握手环节完成之后,自动执行该方法
console.log("链接成功。。。")
}; ws.onmessage = function (event) {
// 接受服务端发送的消息
// 客户端完成握手验证之后 触发该方法
console.log(event.data);
var tag = $("<div>");
tag.text(event.data);
$("#content").append(tag);
console.log(1) }; function sendMsg() {
// ws.send():发送消息
ws.send($("#txt").val()); }; function closeConn() {
// ws.close():关闭Websocket链接
console.log("断开链接。。。");
ws.close();
}; </script>

在这里就使用简单的方式实现多人聊天的功能,对consumers.py做以下修改:

USER_list = []
class ChatConsumer(WebsocketConsumer): def websocket_connect(self, message):
"""
客户端发送请求进来,触发此方法
:param message:
:return:
"""
self.accept() # 执行accept之后代表链接成功
USER_list.append(self) # 将每一个链接的用户添加到列表中 def websocket_receive(self, message):
"""
客户端发送消息,触发此方法,并返回数据
:param message:
:return:
"""
# print("msg:", message) # msg: {'type': 'websocket.receive', 'text': '123'}
data = message["text"] # 获取字典中的数据
# self.send("over")
for user in USER_list: # 遍历用户列表返回消息
user.send(data) def websocket_disconnect(self, message):
"""
客户端主动断开链接,触发此方法
:param message:
:return:
"""
# 服务端触发异常 StopConsumer
USER_list.remove(self) # 将每一个链接的用户从列表中删除
raise StopConsumer

至此,就简单实现了多人在线聊天的功能。

Django使用channel实现websocket的更多相关文章

  1. Django使用channels实现Websocket连接

    简述: 需求:消息实时推送消息以及通知功能,采用django-channels来实现websocket进行实时通讯.并使用docker.daphne启动通道,保持websocket后台运行 介绍Dja ...

  2. django(channel)到 ubuntu

    1.准备工作 删除各app/migrations/下的以数字开头的数据库同步日志文件: 假设你使用的是Pycharm,我们要生成环境包: pip freeze > requirements.tx ...

  3. IronFort---基于Django和Websocket的堡垒机

    WebSSH有很多,基于Django的Web服务也有很多,使用Paramiko在Python中进行SSH访问的就更多了.但是通过gevent将三者结合起来,实现通过浏览器访问的堡垒机就很少见了.本文将 ...

  4. Django websocket之web端实时查看日志实践案例

    这是Django Channels系列文章的第二篇,以web端实现tailf的案例讲解Channels的具体使用以及跟Celery的结合 通过上一篇<Django使用Channels实现WebS ...

  5. 开发基于Django和Websocket的堡垒机

    WebSSH有很多,基于Django的Web服务也有很多,使用Paramiko在Python中进行SSH访问的就更多了.但是通过gevent将三者结合起来,实现通过浏览器访问的堡垒机就很少见了.本文将 ...

  6. django + nginx + uwsgi + websocket

    最近使用django框架做了一个简单的聊天机器人demo, 开发的过程中使用了django自带的websocket模块,当使用django框架自带的wsgi服务去启动的话,没有什么问题.如果要使用uw ...

  7. 11 Django实现WebSocket

    因为需要实时显示状态的需求,想到了websocket,但是Django原生不支持websocket,后来搜索到了chango-channels项目,可以实现次需求. 一.Channels 官方文档 二 ...

  8. Flask websocket

    websocket 概念 是一套协议,协议规定了: - 连接时需要握手 - 发送数据进行加密 - 连接之后不断开 意义 实现长轮询等操作 框架支持 - flask,gevent-websocket - ...

  9. Django使用Channels实现WebSocket--下篇

    希望通过对这两篇文章的学习,能够对Channels有更加深入的了解,使用起来得心应手游刃有余 通过上一篇<Django使用Channels实现WebSocket--上篇>的学习应该对Cha ...

随机推荐

  1. 4. js

    1.) ~   操作符 console.log(~-2)  // 1 console.log(~-1)  // 0 console.log(~0)  // -1 console.log(~1)  // ...

  2. Chrome 浏览器安装 ChroPath 插件

    1.下载地址 http://www.cnplugins.com/devtool/chropath/download.html 2.安装方法 a.把下载的文件更改后缀名变为压缩包,然后解压到本地:如下图 ...

  3. [PHP]听说随机数mt_rand()比rand()速度快,闲的无聊测试了一下!

    废话不说上码 //microtime() 函数返回当前 Unix 时间戳的微秒数.//当设置为 TRUE 时,规定函数应该返回一个浮点数,否则返回一个字符串.默认为 FALSE. <?php h ...

  4. SQL三表连接查询与集合的并、交、差运算查询

    use db_sqlserver2 select 姓名, 工资, 面积, 金额, (工资+金额/1000) as 实发工资 from 职工,仓库, 订购单 where 职工.职工号=订购单.职工号 a ...

  5. CRS-0184 Cannot communicate with the CRS daemon

    事件背景 rman清理脚本异常.导致磁盘空间爆满(一个环境变量没有设置正确) 释放磁盘空间,进行rman清理 之后,领导把实例重启,但是ams实例没有关闭 环境 系统 : AIX 数据库: Oracl ...

  6. 【手把手教你】win10 虚拟机 VMware Workstation Pro 15下安装redhat 8.0

    安装redhat8.0 和安装Ubuntu 差别不大 可以参考上篇文章:https://www.cnblogs.com/zero-vic/p/11593683.html 但是redhat  8.1 b ...

  7. puppet报告系统Dashboard部署及配置详解

    Puppet Dasshboard是由支持Puppet开发的公司Puppetlabs创建的,是Ruby on Rails程序.可以作为一个ENC(外部节点分类器)以及一个报告工具,并且正在逐渐成为一个 ...

  8. muduo网络库源码学习————Exception类

    Exception类是为异常捕获而设计,可以获得异常的信息以及栈的回溯信息 (原来的代码没有demangle成员函数,输出的格式比较难看,加了demangle成员函数,利用demangle成员函数可以 ...

  9. Linux安装maven(详细教程)

    一.简介 Maven是意第绪语,意思是“知识的积累者”,最初是为了简化Jakarta Turbine项目中的构建过程.有几个项目,每个项目都有自己的Ant构建文件,所有项目都略有不同.JAR已检入CV ...

  10. [UWP]推荐一款很Fluent Design的bilibili UWP客户端 : 哔哩

    UWP已经有好几个Bilibili的客户端,最近有多了一个: 哔哩 - Microsoft Store 作者云之幻是一位很擅长设计的UWP开发者,我也从他那里学到了很多设计方面的技巧.它还是一位Bil ...