Django使用channel实现websocket
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的更多相关文章
- Django使用channels实现Websocket连接
简述: 需求:消息实时推送消息以及通知功能,采用django-channels来实现websocket进行实时通讯.并使用docker.daphne启动通道,保持websocket后台运行 介绍Dja ...
- django(channel)到 ubuntu
1.准备工作 删除各app/migrations/下的以数字开头的数据库同步日志文件: 假设你使用的是Pycharm,我们要生成环境包: pip freeze > requirements.tx ...
- IronFort---基于Django和Websocket的堡垒机
WebSSH有很多,基于Django的Web服务也有很多,使用Paramiko在Python中进行SSH访问的就更多了.但是通过gevent将三者结合起来,实现通过浏览器访问的堡垒机就很少见了.本文将 ...
- Django websocket之web端实时查看日志实践案例
这是Django Channels系列文章的第二篇,以web端实现tailf的案例讲解Channels的具体使用以及跟Celery的结合 通过上一篇<Django使用Channels实现WebS ...
- 开发基于Django和Websocket的堡垒机
WebSSH有很多,基于Django的Web服务也有很多,使用Paramiko在Python中进行SSH访问的就更多了.但是通过gevent将三者结合起来,实现通过浏览器访问的堡垒机就很少见了.本文将 ...
- django + nginx + uwsgi + websocket
最近使用django框架做了一个简单的聊天机器人demo, 开发的过程中使用了django自带的websocket模块,当使用django框架自带的wsgi服务去启动的话,没有什么问题.如果要使用uw ...
- 11 Django实现WebSocket
因为需要实时显示状态的需求,想到了websocket,但是Django原生不支持websocket,后来搜索到了chango-channels项目,可以实现次需求. 一.Channels 官方文档 二 ...
- Flask websocket
websocket 概念 是一套协议,协议规定了: - 连接时需要握手 - 发送数据进行加密 - 连接之后不断开 意义 实现长轮询等操作 框架支持 - flask,gevent-websocket - ...
- Django使用Channels实现WebSocket--下篇
希望通过对这两篇文章的学习,能够对Channels有更加深入的了解,使用起来得心应手游刃有余 通过上一篇<Django使用Channels实现WebSocket--上篇>的学习应该对Cha ...
随机推荐
- JAVA的synchronized写法
使用关键字synchronized的写法比较多,常用的有如下几种,代码如下: public class MyService { synchronized public static void test ...
- 为什么redis是单线程的以及为什么这么快?
官网的说法 我们先来认真看一下官网的说法.翻译过来大意如下: CPU并不是您使用Redis的瓶颈,因为通常Redis要么受内存限制,要么受网络限制.例如,使用在一般Linux系统上运行的流水线Redi ...
- synchronized 代码块怎么用
加不加 synchronized 有什么区别? synchronized 作为悲观锁,锁住了什么? 之前 2 篇文章我们已经知道 synchronized 的使用方法以及锁的内容(实例对象和Class ...
- 使用宝塔面板部署tp5网站
来源:https://www.cnblogs.com/e0yu/p/9102902.html 遇到一个问题,就是当thinkphp5部署在宝塔面板上,会出现这个问题: 参考解决办法: http://w ...
- Python学习17之类3继承
'''''''''继承:在继承原有类功能的基础上,增加新的功能(属性或者方法),形成新的类被继承的类:父类新的类:子类 格式:class 子类(父类) class 子类(父类1,父类2,父类3...) ...
- [Qt] 文本文件读写, 摘自官方文档
Reading Files Directly The following example reads a text file line by line: QFile file("in.txt ...
- 从一个数对列中找出素数对用于RAS加密的C++程序
#include <iostream> #include <cmath> using namespace std; const int n = 10000; int isPri ...
- 怎么在java中关闭一个thread
怎么在java中关闭一个thread 我们经常需要在java中用到thread,我们知道thread有一个start()方法可以开启一个线程.那么怎么关闭这个线程呢? 有人会说可以用Thread.st ...
- js 实现文字滚动功能,可更改配置参数 带完整版解析代码。
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 本篇文章为您分析一下原生JS写文字滚动效果 需求分析: 需要 ...
- HTML入门——互动式推送初尝试
0.背景 疫情原因,导致许多大众喜闻乐见的体育活动停摆,但博主和队友们运营的体育社团公众号不能停摆.为了利用当下线上活动频率高的契机增加关注量,加之微信推送的互动性已成为趋势,博主打算和队友们尝试实现 ...
