1:HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>在线客服系统</title>
</head> <body>
{% comment %} 热键 {% endcomment %}
<input type="text" id="message" value="" onkeydown="inpuKeyDown(event)"/>
<button type="button" id="send_message">发送 message</button>
<button type="button" id="close">关闭连接</button>
<div id="messagecontainer"></div> </body>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript"> var name = '{{username}}'; // 发送到连接上去的后台
var socket = new WebSocket("ws://" + window.location.host + "/websocket/" + name); //发送数据到服务端
socket.onopen = function () {
alert("您已经连接上客服")
}; // 发送按钮点击
$('#send_message').click(function () {
$('#messagecontainer').prepend('<p>' + $('#message').val() + '</p>'); if (!socket) {
alert("请重新连接")
} else {
socket.send($('#message').val());
} }); // 打印服务端返回的数据 接收消息
socket.onmessage = function (e) {
$('#messagecontainer').prepend('<p>' + e.data + '</p>');
}; // 错误时
socket.onerror = function (event) {
console.log(" websocket.onerror ");
}; // 断开连接时
$("#close").click(function () {
if (socket) {
socket.send("quit");
alert("已断开连接,客服将收不到您发送的信息")
socket.close()
}
}); // 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
socket.close();
} // 发送热键设置
function inpuKeyDown(event) {
// console.log(event)
if (event.keyCode == 13) { // 发送消息
socket.send($('#message').val()); }
} // 心跳包
setInterval(() => {
socket.send('Hear_t#Beat');
}, 60000) </script>
</html>

 配置:

:url.py

urlpatterns = [
url(r'^admin/', admin.site.urls),
url('websocket_client/(?P<username>\w+)', view.websocket_client),
url('websocket/(?P<username>\w+)', view.websocket),
] 2:settings.py INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"dwebsocket",
] EBSOCKET_ACCEPT_ALL=True # 可以允许每一个单独的视图实用websockets

 3:view.py:


"""
1 心跳包问题:定时发送标识到后端,返回一个标识,前端叠加变量,超过3次就断开连接
2 一对一指定用户聊天:使用数据库记录两个ID对应的聊天记录,用户访问sockt网页后取出数据发送到聊天框
3 聊天室 将所有用户发送的消息,储存在redis或者session里面,每个用户访问网页后将全部信息遍历发送到对方的聊天框 """ import json
import time
from dwebsocket.decorators import accept_websocket
from django.shortcuts import render,HttpResponse # Create your views here.
def websocket_client(request, username):
return render(request,'index.html',{'username': username}) # 存储连接websocket的用户
clients = [] @accept_websocket
def websocket(request, username):
try:
if request.is_websocket():
print("request",request) print("当前用户",username) # 是否是第一次连接
if username not in clients:
# 设置发送数据为json格式 回复对应的用户
request.websocket.send(json.dumps({"first":"您好,很高兴为您服务,请简单简述您需要提问的问题{}".format(time.strftime('%Y.%m.%d %H:%M:%S', time.localtime(time.time())))}, ensure_ascii=False).encode("utf-8"))
# 添加用户到已经存在用户
clients.append(username)
else:
request.websocket.send(json.dumps({"User":"欢迎回来~"}, ensure_ascii=False).encode("utf-8")) print("当前咨询所有用户",clients) # 设置发送至前端的次数
while True: # for message in request.websocket:
message = request.websocket.wait() if not message:
break
else:
str_message = str(message, 'utf-8')
print('message',str_message) # 如果收到是心跳标志 就加1
if str_message == "Hear_t#Beat":
heart = heart + 1 if str_message == 'quit':
print("quit里面")
clients.remove(username)
request.websocket.close() # 关闭服务
break # 添加到数据库 redis
# 取到两个用户的数据发送给前台 # 设置发送前端的数据
messages = {
'time': time.strftime('%Y.%m.%d %H:%M:%S', time.localtime(time.time())),
'msg': str_message,
} # 设置发送数据为json格式 回复对应的用户
request.websocket.send(json.dumps(messages,ensure_ascii=False).encode("utf-8"))
except:
pass
 

【Django组件】WebSocket的简单实现的更多相关文章

  1. python 全栈开发,Day78(Django组件-forms组件)

    一.Django组件-forms组件 forms组件 django中的Form组件有以下几个功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显 ...

  2. python 全栈开发,Day76(Django组件-cookie,session)

    昨日内容回顾 1 json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() ...

  3. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  4. Django组件补充(缓存,信号,序列化)

    Django组件补充(缓存,信号,序列化) Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑 ...

  5. Django - 文件上传、Django组件 - 分页器(paginator)

    一.文件上传准备知识 - Content-Type 1.请求头 - Content-Type Content-Type指的是请求体的编码类型,常见的类型共有3种: 1)application/x-ww ...

  6. Django组件-cookie,session

    昨日内容回顾: json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() 反 ...

  7. django 实现websocket

    一.简述:django实现websocket,之前django-websocket退出到3.0之后,被废弃.官方推荐大家使用channels. channels通过升级http协议 升级到websoc ...

  8. Django组件总结

    Django组件介绍 分页器的使用 分页器在页面中非常常见,当数据库条数数据过多时,页面一次性显示不好看时,我们可以使用分页器,将数据分几次显示. 1.1 数据库内插入大量数据 Booklist=[] ...

  9. Django学习 之 Django安装与一个简单的实例认识

    一.Django简介 1.MVC与MTV模型 (1)MVC模型 Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的. ...

  10. Django 组件之 ----- content-type

    Django 组件之 content-type的使用 一个表和多个表进行关联,但具体随着业务的加深,表不断的增加,关联的数量不断的增加,怎么通过一开始通过表的设计后,不在后期在修改表,彻底的解决这个问 ...

随机推荐

  1. Java中保留小数点后几位

    不想多说啥了..ε=(´ο`*)))唉  基础都给忘了..今天比赛 跌入十八层地狱.... 用DecimalFormat对象的format方法进行格式化.. package cn.test; impo ...

  2. C++栈(stack)、队列(queue)、链表(list)的常用函数

    C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一 ...

  3. Buy a Ticket,题解

    题目连接 题意: 没个位置有一个点权,每个边有一个边权,求对于每个点u的min(2*d(u,v)+val[v])(v可以等于u) 分析: 我们想这样一个问题,从u到v的边权*2再加一个点权就完了,我们 ...

  4. 02 . SaltStack高级用法(Python API)

    Python API简单使用 第一条命令 /usr/bin/salt默认使用的接口是LocalClient,该接口只能在salt master上使用 >>> import salt. ...

  5. git clone 别人的项目的步骤

    1.)从github上克隆出来 git clone +项目地址 2)切换到你需要的分支 git checkout +分支名称 3)下载到你的电脑上之后,在项目根目录中 npm install 安装所有 ...

  6. python 检索文件内容工具

    公司内部需求一个工具检索目录下的文件在另外的目录中使用次数, 用来优化包体的大小. 此代码效率并不高效, 另添加对应的 后缀检索. 用python 实现比较快速, 另还有缺点是只支持 utf-8 格式 ...

  7. 题解:2018级算法第二次上机 Zexal的排座位

    题目描述: 样例: 实现解释: 一道看似复杂但实际既是斐波那契变形的题目 知识点:递推,斐波那契 通过问题的描述,可以得到以下规律:(除了座位数为一时)男生坐最后时,倒数第二个一定是女生:女生坐最后, ...

  8. jsp页面中同时遍历多个list集合

    在Jsp页面中,我们也许有这样的需求:从后端获取到多个List,但又想将这些List的值同时打印出来 比如, 有用户列表userList,user类有用户ID.用户名.用户性别等基本信息 有用户关系列 ...

  9. 爬虫黑科技,我是怎么爬取indeed的职位数据的

    最近在学习nodejs爬虫技术,学了request模块,所以想着写一个自己的爬虫项目,研究了半天,最后选定indeed作为目标网站,通过爬取indeed的职位数据,然后开发一个自己的职位搜索引擎,目前 ...

  10. java大数据最全课程学习笔记(2)--Hadoop完全分布式运行模式

    目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages 目录 Hadoop完全分布式运行模式 步骤分析: 编写集群分发脚本xsync 集群配置 集群部署规划 配置集群 集群单 ...