5

我使用 Django 1.10 作为我们构建的仓储应用程序的后端。

我正在添加另一个新功能,其中一个网页将显示在一个巨大的显示器上。这个网页除了 1 个巨大的数字外什么都不会显示。

我有一个 RFID 设备,一旦检测到 RFID 标签,就会向我的 Django 服务器发送一个 http 请求。

发生这种情况时,我希望 RFID 标签中的数字显示在前面提到的网页上。

我已经简要地阅读了有关 socket.io 的内容,但我想尽可能地保留在 Django 世界中。我也简要了解了 Django Channels。

我的问题是:

  1. 我应该在这个用例中使用 Django Channels 吗?
  2. 如果是这样,我该如何使用上面的用例来做到这一点?
4

2 回答 2

8

这实际上取决于您显示的信息的使用情况,如果您不需要该数字是实时的,那么您可以选择每 X 秒一次的常规 AJAX 轮询,就像 zwer 的评论中提到的那样。

现在,如果您需要该数字是实时的,那么您应该使用 websockets 和 django 通道,设置一个可以满足您需求的代码库真的很容易。

假设您安装了 django 频道并配置了您的设置

首先,您需要设置管理 websocket 的consumers.py逻辑routing.py(将它们视为websocket 逻辑)。views.pyurls.py

消费者.py

from channels import Group
from channels.auth import channel_session_user_from_http, channel_session_user


@channel_session_user_from_http
def ws_add(message):
    # Authenticates the client
    # ASGI WebSocket packet-received and send-packet message types
    # both have a "text" key for their textual data.
    message.reply_channel.send({
        "accept": True,
    })
    Group("rfid-group").add(message.reply_channel)


@channel_session_user
def ws_message(message):
    # You can process messages you receive from the socket here
    # Apply w/e logic validation


@channel_session_user
def ws_disconnect(message):
    Group("rfid-group").discard(message.reply_channel)

路由.py

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

routing_routing = [
    route("websocket.connect", ws_add),
    route("websocket.receive", ws_message),
    route("websocket.disconnect", ws_disconnect),
]

现在需要编写前端websocket逻辑:

<script>
    socket = new WebSocket("ws://" + window.location.host);
    socket.onmessage = function(e) {
        console.log("Message received");
        // Process the received number here
        console.log(e.data);
    }
</script>

这将建立一个 websocket 连接,将客户端订阅到一个名为 的组"rfid-group",现在发送到该组的任何消息都将回显给该组的所有订阅者,这可以处理多个客户端。

现在我们需要监听来自 rfid 设备的请求、处理它并将结果发送到显示器的部分,这应该很简单view,因为 RFID 设备将发送常规 HTTP 信息。

from django.http import HttpResponse
from channels import Group


def rfid_processor(request):
    '''
      Consider authenticating your rfid_num producer to prevent
      someone messing with your api
    '''
    rfid_num = request.GET.get("rfid", "")
    if rfid_num:
        Group("rfid-group").send({"text": rfid_num})
        return HttpResponse(status=200)

    return HttpResponse(status=500)

将其连接到 url:

from app.views import rfid_processor
urlpatterns = [
    url(r'^rfid/$', rfid_processor),
]

这就是设置最小工作 django 通道项目所需的全部内容,该项目将从 RFID 设备接收到的数字回显到显示屏。

希望这可以帮助。

于 2017-02-17T16:29:27.563 回答
0

Try reading on this website. https://realpython.com/blog/python/django-and-ajax-form-submissions/ I think this might help you. Also, HassenPy has a pretty good answer. Be sure to read that answer.

于 2017-02-19T05:17:53.913 回答