首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不刷新的情况下显示从服务器推送到网页的更新?

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

Stack Overflow用户
提问于 2017-02-15 01:43:02
回答 2查看 2.1K关注 0票数 5

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

我正在添加另一个新的功能,其中一个网页将显示在一个巨大的显示器。这个网页只会显示一个巨大的数字。

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

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

我读过关于socket.io的简要文章,但我希望尽可能多地保留在Django宇宙中。我也读过关于Django频道的简短文章。

我的问题是:

  1. 对于这个用例,我应该使用Django通道吗?
  2. 如果是这样的话,我该如何处理上面的用例呢?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-17 16:29:27

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

现在,如果您需要这个数字是实时的,那么您应该选择websockets和django通道,这样就可以很容易地设置一个代码库来实现您想要的功能。

假设你是安装django通道并配置您的设置

首先,您需要设置管理websocket的consumers.pyrouting.py逻辑(可以将它们看作views.pyurls.py,但用于websocket逻辑)。

consumers.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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逻辑:

代码语言:javascript
复制
<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信息。

代码语言:javascript
复制
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)

把它挂到网址上:

代码语言:javascript
复制
from app.views import rfid_processor
urlpatterns = [
    url(r'^rfid/$', rfid_processor),
]

这就是您需要设置的最小工作django通道项目,该项目将把从RFID设备接收到的数字回放到显示屏幕上。

希望这能有所帮助。

票数 8
EN

Stack Overflow用户

发布于 2017-02-19 05:17:53

试着在这个网站上阅读。https://realpython.com/blog/python/django-and-ajax-form-submissions/,我想这可能对你有帮助。而且,HassenPy有一个很好的答案。一定要读一下答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42239349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档