[PYTHON] Um die Veröffentlichung von Django 3.0 zu feiern, habe ich ASGI, den spirituellen Nachfolger von WSGI, ausprobiert, aber der Web-Socket hat nicht funktioniert.

Feier! Django 3.0 veröffentlicht!

02/02/2019 Django 3.0 wurde veröffentlicht. Django 1.0 wurde 2008 und 2.0 im Dezember 2017 veröffentlicht. Und 3.0 wurde am 2. Dezember dieses Jahres veröffentlicht. Das Upgrade von 1 auf 2 dauerte ungefähr 10 Jahre, aber es war eine überraschende Geschwindigkeit von weniger als 2 Jahren von 2 auf 3. Was um alles in der Welt habe ich in den letzten zwei Jahren im Vergleich dazu getan? Schauen wir uns nun die neuen Funktionen an, die mir persönlich in Django 3.0 wichtig sind!

Was ist ASGI-Unterstützung?

Ich war neugierig darauf. Trotzdem habe ich ASGI nie berührt und offiziell unterstützt! Obwohl mir gesagt wurde, war es so. Aber ich habe WSGI-san ... Als ich es jedoch nachschlug, schien es, dass ASGI etwas war, das nicht ignoriert werden konnte.

Laut Release Note befindet sich die asynchrone Funktion derzeit nicht in WSGI und wird nur unterstützt, wenn sie in ASGI ausgeführt wird. (Aber glauben Sie, wir werden es in Zukunft unterstützen?) ASGI-Beamter sagt: "ASGI ist der spirituelle Nachfolger von WSGI (spirituelle Fortsetzung. Wiki /% E7% B2% BE% E7% A5% 9E% E7% 9A% 84% E7% B6% 9A% E7% B7% A8)) ”. Auf diese Weise scheint WSGI, das mein starker Verbündeter zu sein schien, abwärtskompatibel mit ASGI zu sein.

Es spielt keine Rolle, aber das Wort "spirituelle Fortsetzung" ist cool. Es scheint, dass Xenosaga für Xenogias, Perfect Dark für Golden Eye 007 usw. dem entsprechen. WSGI und ASGI sind jedoch keine Spiele oder Fiktionswerke, und ist die Fortsetzung wirklich geeignet? Ich dachte, also werde ich es als geistiger Nachfolger lesen. Das habe ich im Titel geschrieben.

Versuchen Sie, Django mit ASGI auszuführen

Wenn es entschieden würde, wäre die Geschichte schnell, also habe ich versucht, Django mit ASGI zu betreiben. Erstellen Sie mit Docker eine Umgebung.

sudo docker run --rm -it -p 8000:8000 python:3.8 bash

Ich benutze Python3.8. Django 3.0 unterstützt übrigens Python 3.6, 3.7 und 3.8.

pip install django daphne

Installieren Sie daphne zusammen mit django. daphne sieht aus wie ein Server für ASGI. Das "uWSGI" im "WSGI" ist wahrscheinlich das "Daphne" im "ASGI". sicherlich. Daphne scheint übrigens Daphne zu heißen. Obwohl Django ein Django ist, sollte Daphnes d richtig ausgesprochen werden.

django-admin startproject app
cd app
daphne -b 0.0.0.0 -p 8000 app.asgi:application

Erstellen Sie nach der Installation ein Projekt und versuchen Sie es sofort auszuführen.

Hurra! gerührt! Fertig!

django3.png

Es hat funktioniert, aber ich weiß nicht, was mich glücklich macht. Ja, na klar. Obwohl die asynchrone Funktion zum Verkauf steht, kommuniziert sie nur synchron.

Gibt es nicht ein Tutorial wie das Erstellen einer Chat-App, mit der Sie die asynchrone Kommunikation mit Django ausprobieren können?

war. https://channels.readthedocs.io/en/latest/tutorial/index.html Wenn Django-Kanäle verwendet werden, scheint es, dass Web-Socket mit Djang verwendet werden kann, und es gibt ein höfliches Chat-App-Tutorial. Es ist meine Seele, eine Chat-App auszuführen, die durch Kopieren mit Daphne erstellt wurde. Ich bin mir jedoch nicht sicher über die Beziehung zwischen Django-Kanälen und dieser ASGI-Unterstützung. Nun, aber gehen Sie nicht zu tief, wie Sie vielleicht herausfinden, wenn Sie es benutzen.

Platzieren Sie das gemäß dem Tutorial erstellte fertige Produkt hier hier. Ich werde versuchen, es zu bewegen. Es befindet sich im Status "Befehl: python manage.py runserver 0.0.0.0: 8000".

sudo docker-compose up -d

Ich habe den Vorgang mit 2 Fenstern bestätigt, kann aber den Chat ordnungsgemäß verwenden.

mov2.gif

Lassen Sie uns dies jetzt mit daphne verschieben. Schreiben Sie den Befehl wie folgt um:

 services:
     app:
         build: .
-        command: python manage.py runserver 0.0.0.0:8000
+        command: daphne -b 0.0.0.0 -p 8000 mysite.asgi:application
         volumes:
             - .:/srv
         ports:

Dies sollte wie erwartet funktionieren ...

sudo docker-compose down
sudo docker-compose up -d

ws.png Hmm, es funktioniert nicht.

Wenn ich die Fehlermeldung lese, heißt es, dass der Websocket nicht verwendet werden kann.

172.17.0.1:52480 - - [06/Dec/2019:07:36:28] "GET /chat/a/" 200 1413
172.17.0.1:52488 - - [06/Dec/2019:07:36:28] "WSCONNECTING /ws/chat/a/" - -
2019-12-06 07:36:29,471 ERROR    Exception inside application: Django can only handle ASGI/HTTP connections, not websocket.
  File "/usr/local/lib/python3.8/site-packages/daphne/cli.py", line 30, in asgi
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/django/core/handlers/asgi.py", line 144, in __call__
    raise ValueError(
  Django can only handle ASGI/HTTP connections, not websocket.
172.17.0.1:52488 - - [06/Dec/2019:07:36:29] "WSDISCONNECT /ws/chat/a/" - -

Schauen wir uns in Zeile 144 von asgi.py um.


    async def __call__(self, scope, receive, send):
        """
        Async entrypoint - parses the request and hands off to get_response.
        """
        # Serve only HTTP connections.
        # FIXME: Allow to override this.
        if scope['type'] != 'http':
            raise ValueError(
                'Django can only handle ASGI/HTTP connections, not %s.'
                % scope['type']
            )

Es scheint, dass es eine Ausnahme auslöst, wenn es sich nicht um HTTP-Verbindungen handelt. Was zur Hölle ist das?

Ich denke es ist auch, aber ich bin nicht sicher. Das Geheimnis vertieft sich nur. Es wird jedoch offiziell erklärt, dass ASGI Django asynchron unterstützen kann, daher werde ich weiterhin genau darauf achten.

Ende

Auf Wiedersehen WSGI. Ich habe ASGI ...

Recommended Posts

Um die Veröffentlichung von Django 3.0 zu feiern, habe ich ASGI, den spirituellen Nachfolger von WSGI, ausprobiert, aber der Web-Socket hat nicht funktioniert.
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, die Einstellungen für verschiedene Datenbanken von Django (MySQL, PostgreSQL) zusammenzufassen.
Ich habe versucht, Resultoon auf Mac + AVT-C875 zu verwenden, war aber unterwegs frustriert.
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Ich habe versucht, YouTube zu kratzen, aber ich kann die API verwenden, also tu es nicht.
Ich möchte in der Django-Verschiebungstabelle scrollen, aber ...
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht zusammenzufassen, wie das EPEL-Repository erneut verwendet wird
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe Jinja2 beim Lesen des Dokuments verglichen, um es mit Django zu verwenden
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Ich möchte komplizierte vier Regeln in der IF-Anweisung der Django-Vorlage verwenden! → Verwenden Sie eine benutzerdefinierte Vorlage
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, die Beispielnachrichten zur Geschäftsintegration in Amazon Transcribe zu übertragen
Ich habe versucht, die Ähnlichkeit der Frageabsicht mit Doc2Vec von gensim abzuschätzen
Ich habe versucht, die Genauigkeit meines eigenen neuronalen Netzwerks zu verbessern
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 3: Reguläre Ausdrücke 25-29]
Ich möchte die Django Debug Toolbar in Ajax-Anwendungen verwenden
Ich habe versucht, die Bewegungen von Wiire-Playern automatisch mit Software zu extrahieren
Ich habe versucht, die logische Denkweise über Objektorientierung zusammenzufassen.
Ich habe versucht, die optimale Route des Traumlandes durch (Quanten-) Tempern zu finden
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, das RSS des Top-Songs des iTunes Store automatisch abzurufen
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Mit COTOHA habe ich versucht, den emotionalen Verlauf des Laufens von Meros zu verfolgen.
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Ich wollte das Suchmodul von Ansible2 verwenden, aber es hat einige Zeit gedauert, machen Sie sich also eine Notiz
Der tree.plot_tree von scikit-learn war sehr einfach und bequem, daher habe ich versucht, zusammenzufassen, wie man es einfach benutzt.
Ich habe versucht, den Befehl umask zusammenzufassen
So überprüfen Sie die Version von Django
Ich versuchte das Weckwort zu erkennen