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!
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.
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.
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.
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.
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
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?
daphne app.asgi: application
unter Verwendung von Django 3.0 auszuführen, ist in erster Linie falschIch 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.
Auf Wiedersehen WSGI. Ich habe ASGI ...
Recommended Posts