2017-02-15 125 views
4

我使用Django 1.10作爲我們構建的倉儲應用程序的後端。如何顯示不經刷新從服務器推送到網頁的更新?

我正在添加另一個新功能,其中將顯示在巨型顯示器上的網頁。除了1個巨型號以外,該網頁不會顯示任何內容。

我有一個RFID設備,一旦檢測到RFID標籤,就會向我的Django服務器發送一個http請求。

當發生這種情況時,我希望RFID標籤中的數字顯示在前面提到的網頁上。

我已經簡要地閱讀了關於socket.io的內容,但是我想盡可能的保留在Django的內部。我也簡單地閱讀了Django頻道。

我的問題是:

  1. 我應該使用Django通道用於該用途的情況下?
  2. 如果是這樣,我如何做到這一點與我上面的用例?
+4

如果你可以稍微延遲一點,可以使用AJAX/jQuery.load()定期(比如說每秒)輪詢後端的更新巨型號碼,然後替換當前顯示的號碼。如果你絕對需要立即改變,你將不得不使用套接字(直接或通過Django頻道),但我認爲這有點矯枉過正。 – zwer

+0

謝謝@zwer我決定現在用Ajax輪詢。回頭看Django Channels –

回答

4

這實際上取決於您顯示的信息的用法,如果您不需要實時的數字,那麼您可以選擇每隔X秒進行一次常規AJAX民意測驗,如提到的zwer的評論。

現在,如果您需要實時編號,那麼您應該選擇websockets和django頻道,設置一個您想要的代碼庫非常簡單。

假設你installed django channels and configured your settings

首先,你需要建立一個管理的WebSockets的consumers.pyrouting.py邏輯(想想那些爲views.pyurls.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> 

這將建立一個網站ocket連接,訂閱客戶端到一個名爲"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設備接收到顯示屏幕上的號碼。

希望這會有所幫助。

+1

謝謝。還沒有時間去測試django頻道呢。但無論如何將獎勵賞金。 –

+0

yw,dw,它非常易於使用,只需要幾個小時即可完成整個渠道項目。 – HassenPy

相關問題