使用方法
使用上很方便,如果为一个单独的视图函数处理一个websocklet连接可以使用accept_websocket装饰器,它会将标准的HTTP请求路由到视图中。使用require_websocke装饰器只允许使用WebSocket连接,会拒绝正常的HTTP请求。
一些属性和方法
1.request.is_websocket()
如果是个websocket请求返回True,如果是个普通的http请求返回False,可以用这个方法区分它们。
2.request.websocket
在一个websocket请求建立之后,这个请求将会有一个websocket属性,用来给客户端提供一个简单的api通讯,如果request.is_websocket()是False,这个属性将是None。
3.WebSocket.wait()
返回一个客户端发送的信息,在客户端关闭连接之前他不会返回任何值,这种情况下,方法将返回None
4.WebSocket.read()
如果没有从客户端接收到新的消息,read方法会返回一个新的消息,如果没有,就不返回。这是一个替代wait的非阻塞方法
5.WebSocket.count_messages()
返回消息队列数量
6.WebSocket.has_messages()
如果有新消息返回True,否则返回False
7.WebSocket.send(message)
向客户端发送消息
8.WebSocket.__iter__()
websocket迭代器
代码
# dwebsocket
from dwebsocket.decorators import accept_websocket
# 链接的集合,使用集合的原因是因为集合的特性
clients ={}
#使用accept_websocket装饰器
@accept_websocket
#装饰函数
def websocketlink(request):
if request.is_websocket():
while True:
#前端发回的数据,我用的是用户id
message = request.websocket.wait()
# 如果为False就退出
if not message:
break
# 否则就把用户id作为websocket属性,用来给客户端提供一个简单的api通讯
else:
# print("websocket"+str(message))
clients[message] = request.websocket
# 在线聊天
def send(request):
# 获取消息
# 前端发来的聊天
msg=request.POST.get("msg")
# 前端发来的用户名
name = request.POST.get("name")
# 将用户名和聊天拼接
msgs = name+" 说"+": "+msg
print(msg)
# 限制发送聊天语句频率
try:
# hincrby类型用get取会报错,证明已经存在于数据库中
r.get (name)
# print(r.get (name))
except Exception as e:
print (e)
return HttpResponse ({'code': 1001, 'msg': '发送频繁'})
# 把用户名添加到Redis
r.hincrby(name,1)
# 设置时间
r.expire(name,5)
# 聊天记录加进mysql
# emoji表情不能直接添加进mysql需要编码为utf-8
News.objects.create(uname=name,news=msgs.encode("utf-8"))
# 获取到当前所有在线客户端,即clients
# 遍历给所有客户端推送消息
for client in listid:
print(1)
listid[client].send(msgs.encode ("utf-8"))
return HttpResponse({"msg":"ok"})