[PYTHON] So führen Sie vom Server gesendete Ereignisse in Django durch

Ich hatte nicht genug Zeit, um WebSocket mit Django zu machen, aber ich wollte serverseitigen Push machen, also entschied ich mich, SSR durch Push zu verwenden. Ich würde mich freuen, wenn Sie auf Korrekturen hinweisen könnten.

Hinweis

Wenn ich mit einem lokalen Server experimentierte und die Verbindung unterbrach, [ConnectionAbortedError: [WinError 10053] Die hergestellte Verbindung wurde von der Host-Computersoftware abgebrochen. Ich erhalte die Fehlermeldung Es ist wahrscheinlich harmlos, aber unangenehm. Seien Sie also vorsichtig, wenn Sie damit umgehen.

Was sind Server-gesendete Ereignisse überhaupt?

Grob gesagt ist es ein großartiger Komet. Mit anderen Worten, es ist wie ein Push auf der Serverseite WebSocket ist zwar besser, aber der Vorteil sind geringere Implementierungskosten Wenn Sie mehr wissen möchten, überprüfen Sie bitte.

Zusammenfassung des Codeinhalts

Mach einfach SSE. Lassen Sie alle anderen Funktionen wie ID weg

Code

Python-Seite

Stream-Verteilung

views.py


from django.views.decorators.http import condition
from django.http import StreamingHttpResponse
from django.views.generic import UpdateView, DetailView, FormView, TemplateView, DeleteView
import time


@condition(etag_func=None)
def stream_response(request):
    resp = StreamingHttpResponse(stream_response_generator(), content_type='text/event-stream')
    return resp


def stream_response_generator():
    while(True):
        yield "data: %s\n" \
              "retry:1000\n\n" % 0
        time.sleep(1)


class DevSSETemplate(TemplateView):
    template_name = "stream.html"

urls.py


    url(r'^stream/$', views.stream_response, name='stream_response'),
    url(r'^stream/template/$', DevSSETemplate.as_view(), name='stream_response_template'),

JavaScript-Seite

Holen Sie es sich und fügen Sie es der Liste hinzu

stream.html


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id ="log"></div>
</body>
<script>

window.onload = function() {
  var evtSource = new EventSource("{% url 'accounts:stream_response' %}");
  var eventList = document.getElementById("log");

  evtSource.onmessage = function(e) {
      console.log(e);
      var newElement = document.createElement("li");

      newElement.innerHTML = "message: " + e.data;
      eventList.appendChild(newElement);
  };
}

</script>
</html>

Kommentar

@.condition(etag_func=None) ETag deaktivieren (um den Cache herum)? StreamingHttpResponse Streaming kann mit dieser Methode durchgeführt werden. Es scheint, dass es normalerweise beim Senden von PDF usw. verwendet wird. Einschließlich dieser hat Django viele Funktionen, und es ist schön, Zugang zum juckenden Bereich zu haben.

Impressionen

Es hat vorerst funktioniert SSE hat niedrige Implementierungskosten und scheint in Frameworks nützlich zu sein, in denen die WebSocket-Unterstützung nicht erweitert ist, aber es ist seltsam, dass es aus irgendeinem Grund nicht beliebt ist ~~ wahrscheinlich, weil es nicht gut ist ~~

Recommended Posts

So führen Sie vom Server gesendete Ereignisse in Django durch
[Python] Wie man PCA mit Python macht
Wie man CSS in Django reflektiert
So führen Sie eine arithmetische Verarbeitung mit der Django-Vorlage durch
So machen Sie R chartr () in Python
So löschen Sie abgelaufene Sitzungen in Django
So implementieren Sie Rails-Helfer-ähnliche Funktionen in Django
So reflektieren Sie ImageField in Django + Docker (Kissen)
So erstellen Sie eine Rest-API in Django
So erhalten Sie mehrere Modellobjekte zufällig in Django
So führen Sie eine Hash-Berechnung mit Salt in Python durch
So führen Sie mit OpenCV ein Null-Padding in einer Zeile durch
Verwendung von Bootstrap in der generischen Klassenansicht von Django
Hochladen von Dateien in der generischen Klassenansicht von Django
Wie man Decorator in Django benutzt und wie man es macht
So verweisen Sie auf statische Dateien in einem Django-Projekt
[Django 2.2] Wie zeigen Sie das Beziehungsziel in Django an? [Listenansicht]
So überprüfen Sie das Verhalten von ORM mit einer Datei mit django
So aktualisieren Sie Benutzerinformationen bei der Django RemoteUserMiddleware-Anmeldung
[Django] Wie man Eingabewerte im Voraus mit ModelForm angibt
So generieren Sie eine Abfrage mit dem IN-Operator in Django
So nehmen Sie erste Einstellungen für die Django-Projekterstellung vor
[Blender] Umgang mit Maus- und Tastaturereignissen in Blender-Skripten
Wie man in Django die angezeigte lange Zeichenkette in der Mitte abkürzt ....
Umgang mit Sitzungen in SQLAlchemy
[Django] So testen Sie Form [TDD]
Verwendung von Klassen in Theano
Wie man nüchtern mit Pandas schreibt
So sammeln Sie Bilder in Python
Fehler im Zusammenhang mit Memcached in Django
So aktualisieren Sie Spyder in Anaconda
Verwendung von SQLite in Python
So konvertieren Sie 0,5 in 1056964608 auf einmal
Wie man MySQL mit Python benutzt
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
Wie schreibe ich Django1.9 umweltunabhängig wsgi.py
So führen Sie TensorFlow 1.0-Code in 2.0 aus
Umgang mit Japanisch mit Python
So melden Sie sich bei Docker + NGINX an
So rufen Sie PyTorch in Julia an
[Django] Lesen von Variablen / Konstanten, die in einer externen Datei definiert sind
So stellen Sie eine Django-App in nur 5 Minuten für Heroku bereit
[Tipps] Die Vorgehensweise beim Erstellen von HTML mit Django wird erweitert
Verwendung berechneter Spalten in CASTable
[Einführung in Python] Wie verwende ich eine Klasse in Python?
So unterdrücken Sie Anzeigefehler in matplotlib
Dynamisches Definieren von Variablen in Python
So überprüfen Sie die Version von Django
So konvertieren Sie csv in tsv in CLI
[Itertools.permutations] So löschen Sie eine Sequenz in Python
So implementieren Sie einen verschachtelten Serializer mit drf-flex-Feldern
So arbeiten Sie mit BigQuery in Python
So führen Sie Befehle mit einem Jupyter-Notebook aus
Wie man in GitPython '--gags fetch --tags' macht