如何在不刷新的情况下显示从服务器推送到网页的更新?

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

我正在添加另一个新功能,其中一个网页将显示在巨型显示器上.这个网页除了1个巨号之外什么都不会显示.

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

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

我已经简要阅读了有关socket.io的内容,但我希望尽可能多地保留在Django中.我也简要介绍了Django频道.

我的问题是:

>我应该在这个用例中使用Django频道吗?
>如果是这样,我如何使用上面的用例呢?

最佳答案
这实际上取决于您正在显示的信息的使用情况,如果您不需要实时编号,那么您可以选择每隔X秒进行一次常规的AJAX调查,如zwer评论中提到的那样.

现在,如果您需要实时编号,那么您应该选择websockets和django频道,设置一个能够满足您需求的代码库非常容易.

假设你installed django channels and configured your settings.

首先,您需要设置管理websockets的consumers.py和routing.py逻辑(将它们视为views.py和urls.py,但是对于websocket逻辑).

consumers.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)

routing.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设备收听请求,处理它并将结果发送到显示器的部分,这应该是一个简单的视图,因为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)

把它挂钩到一个网址:

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

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

希望这可以帮助.

转载注明原文:如何在不刷新的情况下显示从服务器推送到网页的更新? - 代码日志