2017-02-15 4 views
4

Я использую Django 1.10 как бэкэнд приложения для складирования, которое мы создали.Как отобразить обновление, перенесенное с сервера на веб-страницу без обновления?

Я добавляю еще одну новую функцию, где веб-страница будет отображаться на гигантском мониторе. Эта веб-страница не покажет ничего, кроме 1 гигантского числа.

У меня есть устройство RFID, которое после обнаружения метки RFID отправит HTTP-запрос на мой сервер Django.

Если это произойдет, я хочу, чтобы номер из метки RFID отображался на упомянутой выше веб-странице.

Я коротко прочитал о socket.io, но я хочу как можно больше удержать вселенную Django. Я кратко прочитал о каналах Django.

Мои вопросы:

  1. следует использовать Django каналы для этого случая использования?
  2. если да, как я могу это сделать с моим прецедентом выше?
+4

Если вы в порядке с небольшой задержкой, вы можете периодически использовать AJAX/jQuery.load(), чтобы периодически (скажите каждую секунду) опросить ваш сервер для обновленного гигантского номера, а затем просто заменить номер, который вы сейчас показываете , Если вам абсолютно необходимо немедленное изменение, вам придется использовать сокеты (напрямую или через Django Channels), но я думаю, что это немного перебор. – zwer

+0

спасибо @zwer Я решил пойти с опросом Ajax на данный момент. Оглянитесь на каналы Django –

ответ

4

Это действительно зависит от использования отображаемой информации, если вам не нужно, чтобы это число было в режиме реального времени, тогда вы можете выбрать обычный опрос AJAX один раз каждые X секунд, как указано в Комментарий zwer.

Теперь, если вам нужно, чтобы этот номер находился в режиме реального времени, вам следует искать веб-порты и каналы django, очень просто настроить базу кода, которая делает то, что вы хотите.

Предполагая, что вы installed django channels and configured your settings.

Прежде всего, необходимо настроить логику consumers.py и routing.py, которая управляет WebSockets (думать о тех, как 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> 

Это установит сеть ocket connection, подписывает клиента на группу под названием "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) 

Hook его URL-адрес:

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

Это все, что вам нужно установить минимальную рабочую Джанго каналов проект, который будет эхо количество полученного от RFID-устройства на экране дисплея (s) ,

Надеюсь, это поможет.

+1

спасибо. еще не успели протестировать каналы джанго. но в любом случае вознаградит награду. –

+0

yw, dw, его очень легко работать, просто нужно пару часов, чтобы пройти через весь проект каналов. – HassenPy