Envie atualizações ao vivo para o cliente através dos Canais e Webs Django
Estou tentando criar uma página que mostre dados de atualização ao vivo para o cliente. O resto do site é construído com o Django, então estou tentando usar canais para isso.
Os dados que estou exibindo são salvos em um arquivo JSON e em um banco de dados MySQL para cálculos adicionais em outras partes do site. Idealmente,Gostaria de exibir os dados mais recentes recebidos (ou seja, quando o arquivo é atualizado) para o cliente conforme ele é recebido.
E mesmo que eu entenda que os canais são criados exatamente para esse fim, estou tendo problemas para fazê-lo.
Tentei enviar várias solicitações do lado do cliente com atraso e loops no consumidor, mas (ironicamente) apenas atualiza na atualização ou atualiza instantaneamente. No entanto, nenhuma dessas abordagens é acionada por uma alteração no arquivo ou no banco de dados.
Este é o código que "funciona", mas realmente não faz o que é necessário. (também, reconhecidamente, não há basicamente nada lá ...)
# consumers.py
def ws_connect(message):
message.reply_channel.send({"accept": True})
def ws_receive(message):
with open("data.json") as jsonfile:
jsondata = json.load(jsonfile)
res = json.dumps(jsondata)
message.reply_channel.send({ "text": res, })
#routing.py
from channels.routing import route
from .consumers import ws_receive, ws_connect
channel_routing = [
route("websocket.receive", ws_receive, path=r"^/websockets/$"),
route("websocket.connect", ws_connect, path=r"^/websockets/$"),
]
JS usado:
<script>
var wsurl = "ws://" + "mywebsite.com" + "/websockets/";
socket = new WebSocket(wsurl);
socket.onopen = function() {
socket.send("this is a request");
console.log('sent');
}
socket.onmessage = function(message) {
console.log(message.data);
document.getElementById("livedata").innerHTML = message.data;
}
</script>
Ficaria perfeitamente feliz com um link para os documentos que me ajudariam a obter algo assim, pois não consegui encontrar a solução por uma semana inteira.