[PYTHON] Comment faire des événements envoyés par le serveur dans Django

Je n'avais pas assez de temps pour faire WebSocket avec Django, mais je voulais le pousser côté serveur, j'ai donc décidé d'utiliser SSR pour le gérer en le poussant. Je vous serais reconnaissant si vous pouviez signaler des corrections.

Mise en garde

Dans mon expérience avec un serveur local, lorsque j'ai interrompu la connexion, [ConnectionAbortedError: [WinError 10053] la connexion établie a été abandonnée par le logiciel de l'ordinateur hôte. Je reçois le message d'erreur C'est probablement inoffensif, mais c'est désagréable, alors soyez prudent lorsque vous le manipulez.

Qu'est-ce que les événements envoyés par le serveur en premier lieu?

En gros, c'est une grande comète. En d'autres termes, c'est comme une poussée côté serveur push WebSocket peut être meilleur, mais l'avantage est un coût de mise en œuvre plus faible Si vous voulez en savoir plus, veuillez vérifier.

Résumé du contenu du code

Faites simplement SSE. Omettez toutes les autres fonctions telles que l'ID

code

Côté Python

Distribution de flux

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'),

Côté JavaScript

Obtenez-le et ajoutez-le à la liste

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>

Commentaire

@.condition(etag_func=None) Désactiver ETag (autour du cache)? StreamingHttpResponse Le streaming peut être effectué en utilisant cette méthode. Il semble qu'il soit généralement utilisé lors de l'envoi de PDF, etc. Y compris cela, Django a beaucoup de fonctions, et c'est agréable de pouvoir atteindre l'endroit qui démange.

Impressions

Cela a fonctionné pour le moment SSE a un faible coût d'implémentation et semble être utile dans les frameworks où le support WebSocket n'est pas avancé, mais il est étrange qu'il ne soit pas populaire pour une raison quelconque ~~ probablement parce qu'il n'est pas bon ~~

Recommended Posts

Comment faire des événements envoyés par le serveur dans Django
[Python] Comment faire PCA avec Python
Comment refléter CSS dans Django
Comment effectuer un traitement arithmétique avec le modèle Django
Comment faire R chartr () en Python
Comment supprimer des sessions expirées dans Django
Comment implémenter la fonctionnalité de type helper Rails dans Django
Comment refléter ImageField dans Django + Docker (oreiller)
Comment créer une API Rest dans Django
Comment obtenir plusieurs objets de modèle au hasard dans Django
Comment faire un calcul de hachage avec Salt en Python
Comment faire du zéro-padding sur une ligne avec OpenCV
Comment utiliser le bootstrap dans la vue de classe générique Django
Comment télécharger des fichiers dans la vue de classe générique Django
Comment utiliser Decorator dans Django et comment le créer
Comment référencer des fichiers statiques dans un projet Django
[Django 2.2] Comment affichez-vous la destination de la relation dans Django? [Affichage de liste]
Comment vérifier le comportement d'ORM avec un fichier avec django
Comment mettre à jour les informations utilisateur sur Django RemoteUserMiddleware login
[Django] Comment donner des valeurs d'entrée à l'avance avec ModelForm
Comment générer une requête à l'aide de l'opérateur IN dans Django
Comment effectuer les réglages initiaux à partir de la création de projet Django
[Blender] Comment gérer les événements de souris et de clavier dans les scripts Blender
Dans Django, comment abréger la longue chaîne de caractères affichée au milieu ...
Comment gérer une session dans SQLAlchemy
[Django] Comment tester le formulaire [TDD]
Comment utiliser les classes dans Theano
Comment écrire sobrement avec des pandas
Comment collecter des images en Python
Erreur liée à memcached dans django
Comment mettre à jour Spyder dans Anaconda
Comment utiliser SQLite en Python
Comment convertir 0,5 en 1056964608 en un seul coup
Comment utiliser Mysql avec python
Comment envelopper C en Python
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Comment écrire un fichier wsgi.py indépendant de l'environnement Django1.9
Comment exécuter du code TensorFlow 1.0 en 2.0
Comment gérer le japonais avec Python
Comment se connecter à Docker + NGINX
Comment appeler PyTorch dans Julia
[Django] Comment lire les variables / constantes définies dans un fichier externe
Comment déployer une application Django sur heroku en seulement 5 minutes
[Astuces] Comment étendre le modèle lors de la création de HTML avec django
Comment utiliser les colonnes calculées dans CASTable
[Introduction à Python] Comment utiliser la classe en Python?
Comment supprimer l'erreur d'affichage dans matplotlib
Comment définir dynamiquement des variables en Python
Comment vérifier la version de Django
Comment convertir csv en tsv dans la CLI
[Itertools.permutations] Comment créer une séquence en Python
Comment implémenter un sérialiseur imbriqué avec drf-flex-fields
Comment utiliser BigQuery en Python
Comment exécuter des commandes avec Jupyter Notebook
Comment faire 'git fetch --tags' dans GitPython