使用django频道和websockets

时间:2016-08-07 06:45:56

标签: python django websocket django-rest-framework django-channels

我有一个表格可以在 127.0.0.1:8000/dashboard/ 和#34; Ok&#34;输入行坐标。按钮提交坐标。通过调用视图public String getSha512Hash(String password, String saltValue) throws NoSuchAlgorithmException{ String text = saltValue + password ; MessageDigest messageDigest = MessageDigest.getInstance("SHA-512"); byte[] bytes = messageDigest.digest( text.getBytes() ); StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.length; ++i) { sb.append(Integer.toHexString((bytes[i] & 0xFF) | 0x100).substring(1,3)); } return sb.toString(); } ,坐标将发布在 127.0.0.1:8000/api/line / 。在这里,我想将线坐标推回到 127.0.01:8000 / dashboard /

到目前为止,我已完成以下操作:

urls.py:

LineDisplay()

view.py:

from django.conf.urls import url,include
from django.contrib import admin
from . import views

urlpatterns = [
    url(r'^api/line/$',views.LineDisplay.as_view()),
]

consumers.py

class LineDisplay(APIView):
"""
Display the most recent line
"""

    def get(self, request, format=None):
        lines = Line.objects.all()
        serializer = LineSerializer(lines, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        lines = Line.objects.all()
        for line in lines:
            line.delete();
        serializer = LineSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
        info = ""
        info += "Line Coordinates are: "
        lines = Line.objects.all()
        for line in lines:
            info += "x1:" + str(line.x1)
            info += " y1:" + str(line.y1)
            info += " x2:" + str(line.x2)
            info += " y2:" + str(line.y2)
        print info
        Channel('repeat-me').send({'info': info, 'status': True})
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

同样,我添加了以下代码:routing.py

import json

# In consumers.py
from channels import Group

# Connected to websocket.connect
def ws_add(message):
    Group("chat").add(message.reply_channel)

# Connected to websocket.receive
def ws_message(message):
     print "Receive Message now"
     Group("chat").send({
        "text": json.dumps({'status': False})
    })
# Connected to websocket.disconnect
def ws_disconnect(message):
    Group("chat").discard(message.reply_channel)


def repeat_me(message):
    Group("chat").send({
    "text": json.dumps({'status': message.content['status'], 'info':      
     message.content['info']})
     })

settings.py中添加了以下行:

from channels.routing import route
from .consumers import ws_add, ws_message, ws_disconnect, repeat_me

channel_routing = [
    route("websocket.connect", ws_add),
    route("websocket.receive", ws_message),
    route("websocket.disconnect", ws_disconnect),
    route("repeat-me", repeat_me),
]

目前,我不知道如何处理小组&#34;聊天&#34;。我甚至不需要一个小组。为了在发布新行时立即在 127.0.0.1:8000/dashboard / 显示行坐标,还有哪些事情要做?

注意:Line坐标正在正确地发送到 / api / line / 我想我可能必须编写服务器代码才能从通道获取数据并将其推回去,我对吗?感谢。

1 个答案:

答案 0 :(得分:4)

您需要该小组来收集应该接收您的信息的所有频道。每个连接的设备都有一个频道。

设备的频道标识符位于message.reply_channel。群组只是收集所有message.reply_channel的一种方式。

因此,假设任何打开/dashboard/页面的用户都会收到任何已发布的新“信息”项。首先,您需要记住新客户的频道。那就是你的ws_add

def ws_add(message):
    Group("all-my-clients").add(message.reply_channel)

现在刚刚连接的客户端是all-my-clients组的一部分,您通过all-my-clients发送的任何消息也会自动发送给该客户端。

当然你想要自己清理,这就是ws_disconnect的用途。一旦他们执行WebSocket.close()或关闭浏览器等,就删除客户端。

def ws_disconnect(message):
    Group("all-my-clients").discard(message.reply_channel)

最后,还有你的ws_message()。它接收任何传入的消息。

def ws_message(message):
    # Nothing to do here, because you only push, never receive.
    pass

这就是全部。现在,您可以从Django的任何位置向上面定义的组发送消息。只需确保以正确的格式发送响应即可。 Group().send()使用具有字符串值的键dict获取text(请参见下文)。原因是您还可以发送其他数据类型,如blob。但“文本”最适用于此目的。

def post(self, request, format=None):
    lines = Line.objects.all()
    ...
    print info
    response_data = {'info': info, 'status': True}
    Group("all-my-clients").send({
        'text': json.dumps(response_data)
    })
    return Response(serializer.data, status=status.HTTP_201_CREATED)

应该是全部。