如何在不刷新的情况下显示从服务器推送到网页的更新?
How to display an update that is pushed from the server to the webpage without a refresh?
我正在使用 Django 1.10 作为我们构建的仓储应用程序的后端。
我正在添加另一个新功能,其中一个网页将显示在一个巨大的显示器上。此网页除了 1 个大数字外什么也不会显示。
我有一个 RFID 设备,一旦检测到 RFID 标签,就会向我的 Django 服务器发送一个 http 请求。
发生这种情况时,我希望 RFID 标签中的号码显示在前面提到的网页上。
我已经简要阅读了 socket.io 但我想尽可能多地留在 Django 世界中。我也简要阅读了有关 Django Channels 的内容。
我的问题是:
- 我应该为这个用例使用 Django Channels 吗?
- 如果是这样,我该如何处理上面的用例?
这实际上取决于您所显示信息的用途,如果您不需要在 real-time 中使用该数字,那么您可以选择定期 AJAX 每隔就像 zwer 评论中提到的 X 秒。
现在,如果您需要该数字在 real-time 中,那么您应该使用 websockets 和 django 通道,设置一个代码库来执行您想要的操作真的很容易。
假设你installed django channels and configured your settings。
首先,您需要设置管理 websocket 的 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),
]
现在您需要编写 front-end 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 设备收到的数字回显到显示屏。
希望对您有所帮助。
尝试在此网站上阅读。 https://realpython.com/blog/python/django-and-ajax-form-submissions/
我想这可能对你有帮助。此外,HassenPy 有一个很好的答案。请务必阅读该答案。
我正在使用 Django 1.10 作为我们构建的仓储应用程序的后端。
我正在添加另一个新功能,其中一个网页将显示在一个巨大的显示器上。此网页除了 1 个大数字外什么也不会显示。
我有一个 RFID 设备,一旦检测到 RFID 标签,就会向我的 Django 服务器发送一个 http 请求。
发生这种情况时,我希望 RFID 标签中的号码显示在前面提到的网页上。
我已经简要阅读了 socket.io 但我想尽可能多地留在 Django 世界中。我也简要阅读了有关 Django Channels 的内容。
我的问题是:
- 我应该为这个用例使用 Django Channels 吗?
- 如果是这样,我该如何处理上面的用例?
这实际上取决于您所显示信息的用途,如果您不需要在 real-time 中使用该数字,那么您可以选择定期 AJAX 每隔就像 zwer 评论中提到的 X 秒。
现在,如果您需要该数字在 real-time 中,那么您应该使用 websockets 和 django 通道,设置一个代码库来执行您想要的操作真的很容易。
假设你installed django channels and configured your settings。
首先,您需要设置管理 websocket 的 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),
]
现在您需要编写 front-end 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 设备收到的数字回显到显示屏。
希望对您有所帮助。
尝试在此网站上阅读。 https://realpython.com/blog/python/django-and-ajax-form-submissions/ 我想这可能对你有帮助。此外,HassenPy 有一个很好的答案。请务必阅读该答案。