Как я могу сделать SSE с Python (Django)? - PullRequest
0 голосов
/ 23 января 2019

У меня есть две разные страницы: одна (A) отображает данные, взятые из объекта модели, и одна (B) изменяет его поля.Мне бы хотелось, чтобы при отправке данных поста с B на сервер сервер изменял значения в A. Какой лучший способ это сделать?

Этот пример может работать для меня, но он написан на PHP... есть способ повторить это с Python?https://www.w3schools.com/html/html5_serversentevents.asp

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

После прочтения этого , я думаю, что все понял (пожалуйста, прокомментируйте, если я не прав).

Django НЕ поддерживает соединения keep-alive. Это означает, что когда клиент получает сообщение от сервера, соединение немедленно закрывается после (как и любой классический цикл HTTP-запроса / ответа).

Что отличается от запроса text/event-stream, так это то, что клиент автоматически пытается повторно подключиться к серверу каждую секунду (длина может быть изменена с помощью параметра retry).

К сожалению, кажется, что использование SSE в этом случае не представляет интереса, поскольку имеет те же конусы, что и опрос (т. Е. Цикл запроса / ответа происходит каждые X секунд).

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

0 голосов
/ 04 апреля 2019

Это рабочий пример из w3schools в Джанго:

template

<!DOCTYPE html>
<html>
<body>

<h1>Getting server updates</h1>
<div id="result"></div>

<script>
if(typeof(EventSource) !== "undefined") {
  var source = new EventSource("stream/");
  source.onmessage = function(event) {
    document.getElementById("result").innerHTML += event.data + "<br>";
  };
} else {
  document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
}
</script>

</body>
</html>

views

import datetime
from django.http import HttpResponse

def stream(request):
    return HttpResponse(
        'data: The server time is: %s\n\n' % datetime.datetime.now(),
        content_type='text/event-stream'
    )

urls

urlpatterns = [
    path('stream/', views.stream, name='stream')
]

Обновление:

Если вы хотите управлять своими уведомлениями, вы можете создать модель, например:

from django.db import models

class Notification(models.Model):
    text = models.CharField(max_length=200)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    sent = models.BooleanField(default=False)

Затем создайте представление, которое ищет первое неотправленное уведомление и отправляет его:

@login_required
def stream(request):
    notification = Notification.objects.filter(
        sent=False, user=request.user
    ).first()

    text = ''

    if notification:
        text = notification.text
        notification.sent = True
        notification.save()

    return HttpResponse(
        'data: %s\n\n' % text,
        content_type='text/event-stream'
    )

И функцию send_notification, которая создает запись в модели Notification (просто вызовите эту функцию изгде-нибудь в вашем коде):

def send_notification(user, text):
    Notification.objects.create(
        user=user, text=text
    )

Вот и все, просто так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...