websocket在Django中的实现

使用方法

使用上很方便,如果为一个单独的视图函数处理一个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,这个属性将是None3.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"})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值