На мой взгляд, у вас есть два варианта:
- Использовать Каналы , которые являются отличной библиотекой веб-сокетов для Django:
- Сигналы это встроенная функция Django, которая позволит вам узнать, когда данные были сохранены в модели.
- Тогда вам просто нужно реализовать связь Websocket на стороне javascript, что относительно просто.
signal.py пример
@receiver(post_save, sender=CanBusAnalyzerJob, dispatch_uid='update_job_status_listeners')
def update_job_status_listeners(sender, instance, **kwargs):
'''
Sends job status to the browser when a Job is modified
'''
job_id = instance.job_id
group_name = 'new-job-' + job_id
message = {
'total': instance.job_total,
'progress': instance.progress,
'status': instance.status
}
channel_layer = channels.layers.get_channel_layer()
async_to_sync(channel_layer.group_send)(
group_name,
{
'type': 'send_job_progress',
'text': message
}
)
JS-код для проверки соединения через веб-сокет
<script>
var socket = new WebSocket('ws://' + window.location.host + '/ws/');
socket.onopen = function() {
console.log("Websocket connection done!");
if (socket.readyState == WebSocket.OPEN) {
setInterval(function() {
socket.send('Hello World');
}, 10000);
}
};
socket.onmessage = function(e) {
var data = JSON.parse(e.data);
var message = data['message'];
console.log(data);
};
socket.onclose = function(e) {
console.error('Chat socket closed unexpectedly');
};
</script>
ДляМне это нужно, но если вы хотите что-то очень быстрое, вы можете создать представление и зарегистрировать его в файле urls.py, который будет вызываться каждые X секунд из вашего кода веб-интерфейса.Это приведет к извлечению новых данных из базы данных и возврату уже html-кода или только данных и обработке их внутри кода JS.
views.py
Этот пример такжевозможность получать аргументы POST, like и ID, если вам нужно (имя задается в файле urls.py).Если вам просто нужно извлечь данные , удалите третью строку .
class ToggleFavouriteSignalView(View):
def post(self, request, *args, **kwargs):
obj_id = kwargs['signal_id']
try:
model_obj = CanBusLogAnalyzer.objects.get(id=obj_id)
new_val = False if model_obj.favourite else True
model_obj.favourite = new_val
model_obj.save()
response_text = 'Success:Signal setted as favourite.' if new_val else 'Info:Signal removed as favourite.'
return HttpResponse(response_text, status=200)
except CanBusLogAnalyzer.DoesNotExist:
return HttpResponse('Error:The object no longer exists in the database.', status=503)
except Exception:
return HttpResponse('Error:Please check your internet connection.', status=503)
JS код
//For authentication purposes
function getCrsfCookie() {
var cookieValue = null,
name = 'csrftoken';
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i].trim();
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
//Runs every 5 seconds
setInterval(function() {
var csrfcookie = getCrsfCookie();
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 503) {
alert("Error when trying to toggle favourite!")
}
};
url_arr = window.location.href.split("/")
base_url = url_arr[0] + "//" + url_arr[2]
var params = 'signal_id=' + signal_id;
xhttp.open('POST', base_url + destination_url, true);
xhttp.setRequestHeader('X-CSRFToken', csrfcookie);
xhttp.send(params);
}, 5000);