[PYTHON] Ich habe den asynchronen Server von Django 3.0 ausprobiert

Vorwort

maxresdefault.jpg

Django 3.0 wurde vor 3 Tagen offiziell veröffentlicht. Knotenverknüpfung freigeben Bei so vielen Änderungen bin ich sehr daran interessiert, die Unterstützung für "ASGI" hinzuzufügen. Ich würde es gerne tatsächlich benutzen. : sonnig:

Hinweis: Was ist ASGI ?: Aktentasche:

ASGI (Asynchronous Server Gateway Interface) ist der spirituelle Nachfolger von WSGI und soll eine Standardschnittstelle zwischen asynchronen Python-Webservern, Frameworks und Anwendungen bereitstellen.

Während WSGI den Standard für synchrone Python-Apps bereitstellte, bietet ASGI sowohl asynchrone als auch synchrone Apps mit einer abwärtskompatiblen Implementierung von WSGI und mehreren Servern und Anwendungsframeworks.

Dokumentlink

Neues Projekt

Erstellen Sie eine virtuelle Umgebung zum Testen

 mkvirtualenv django3.0

Installieren Sie Django

 pip3 install django

Stellen Sie nach Abschluss der Installation sicher, dass Sie über Django 3.0 verfügen

(django3.0) ~ $ pip3 list
Package    Version
---------- -------
asgiref    3.2.3  
Django     3.0    
pip        19.3.1 
pytz       2019.3 
setuptools 42.0.2 
sqlparse   0.3.0  
wheel      0.33.6

Lassen Sie uns ein neues Projekt erstellen und einen Server starten

mkdir django-test
&&
django-admin startproject newtest
&&
cd newtest/
&&
python3 manage.py runserver

Lassen Sie uns auf Nr. 8000 zugreifen und Sie können die bekannte Rakete sehen.

UNADJUSTEDNONRAW_thumb_38.jpg Bisher Yoshi!: Entspannt :: point_up:

Sehen wir uns das offizielle Dokument an

2019-12-05 19.17のイメージ.jpg

How to deploy with ASGI¶
As well as WSGI, Django also supports deploying on ASGI, the emerging Python standard for asynchronous web servers and applications.

Django’s startproject management command sets up a default ASGI configuration for you, which you can tweak as needed for your project, and direct any ASGI-compliant application server to use.

Django includes getting-started documentation for the following ASGI servers:

How to use Django with Daphne
How to use Django with Uvicorn
The application object¶
Like WSGI, ASGI has you supply an application callable which the application server uses to communicate with your code. It’s commonly provided as an object named application in a Python module accessible to the server.

The startproject command creates a file <project_name>/asgi.py that contains such an application callable.

It’s not used by the development server (runserver), but can be used by any ASGI server either in development or in production.

ASGI servers usually take the path to the application callable as a string; for most Django projects, this will look like myproject.asgi:application.

Warning

While Django’s default ASGI handler will run all your code in a synchronous thread, if you choose to run your own async handler you must be aware of async-safety.

Do not call blocking synchronous functions or libraries in any async code. Django prevents you from doing this with the parts of Django that are not async-safe, but the same may not be true of third-party apps or Python libraries.

Configuring the settings module¶
When the ASGI server loads your application, Django needs to import the settings module — that’s where your entire application is defined.

Django uses the DJANGO_SETTINGS_MODULE environment variable to locate the appropriate settings module. It must contain the dotted path to the settings module. You can use a different value for development and production; it all depends on how you organize your settings.

If this variable isn’t set, the default asgi.py sets it to mysite.settings, where mysite is the name of your project.

Applying ASGI middleware¶
To apply ASGI middleware, or to embed Django in another ASGI application, you can wrap Django’s application object in the asgi.py file. For example:

from some_asgi_library import AmazingMiddleware
application = AmazingMiddleware(application)

Link

Grob zusammengefasst

Öffnen wir den offiziellen Link, um zu sehen, was "Daphne" ist Link.

How to use Django with Daphne¶
Daphne is a pure-Python ASGI server for UNIX, maintained by members of the Django project. It acts as the reference server for ASGI.

Installing Daphne¶
You can install Daphne with pip:

python -m pip install daphne
Running Django in Daphne¶
When Daphne is installed, a daphne command is available which starts the Daphne server process. At its simplest, Daphne needs to be called with the location of a module containing an ASGI application object, followed by what the application is called (separated by a colon).

For a typical Django project, invoking Daphne would look like:

daphne myproject.asgi:application
This will start one process listening on 127.0.0.1:8000. It requires that your project be on the Python path; to ensure that run this command from the same directory as your manage.py file.

Übersetzt

Versuchen wir: point_up:

Starten Sie den ASGI-Server

Daphne Installation

 pip3 install daphne

Server starten

daphne [Projektname].asgi:application

Als ich auf 8000 zugegriffen habe, konnte ich die Rakete wieder sehen, obwohl sich die Charaktere ein wenig verändert haben. : Auge:

2019-12-05 19.59のイメージ.jpg

WebSocket-Test

Ich werde einen Browser öffnen und eine Websocket-Nachricht senden. UNADJUSTEDNONRAW_mini_3b.jpg

Wird "500" zurückgegeben, lautet die Fehlermeldung wie folgt.

2019-12-05 11:02:09,533 ERROR    Exception inside application: Django can only handle ASGI/HTTP connections, not websocket.
  File "/Envs/django3.0/lib/python3.7/site-packages/daphne/cli.py", line 30, in asgi
    await self.app(scope, receive, send)
  File "/Envs/django3.0/lib/python3.7/site-packages/django/core/handlers/asgi.py", line 146, in __call__
    % scope['type']
  Django can only handle ASGI/HTTP connections, not websocket.

Es scheint etwas in Zeile 146 von asgi.py zu geben, schauen wir uns das an.

asgi.py



 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']
            )
        # Receive the HTTP request body as a stream object.
        try:
            body_file = await self.read_body(receive)
        except RequestAborted:
            return
        # Request is complete and can be served.
        set_script_prefix(self.get_script_prefix(scope))

Beachten Sie den zweizeiligen Kommentar unten.

 # Serve only HTTP connections.
 # FIXME: Allow to override this.

Derzeit ist nur die http-Kommunikation zulässig. Bitte reparieren Sie es bei Bedarf selbst!

letzte

Die möglichen Ursachen sind wie folgt.

Aktuelles Django 3.0, wenn Sie Websocket verwenden möchten, empfehlen wir die Verwendung des Django-Channel-Pakets.

Recommended Posts

Ich habe den asynchronen Server von Django 3.0 ausprobiert
Ich habe es mit Django versucht
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe die Sitzungsaufbewahrungsdauer von Django überprüft
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
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, die Grundform von GPLVM zusammenzufassen
Ich habe das MNIST-Tutorial von tensorflow für Anfänger ausprobiert.
Ich habe die Changefinder-Bibliothek ausprobiert!
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Werbung für die Raubkopien-Website zu kratzen
Ich habe die einfachste Methode zur Klassifizierung von Dokumenten mit mehreren Etiketten ausprobiert
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, den Beispielcode des Ansible-Moduls auszuführen
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, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe an der Übersetzungsaktivität des offiziellen Django-Dokuments teilgenommen
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, Djangos Server mit VScode anstelle von Pycharm zu starten
Ich habe versucht, das CNN-Modell von TensorFlow mit TF-Slim umzugestalten
Ich habe versucht, das Lachproblem mit Keras zu erkennen.
Ich habe versucht, den allgemeinen Kommentar des verdammten Spiels des Jahres morphologisch zu analysieren
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Fand die Ursache für die mysteriöse Kommunikation des Minecraft-Servers (Spigot)
Ich habe ein wenig versucht, das Verhalten der Zip-Funktion
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe den Chat von YouTube Live angezeigt und versucht zu spielen
Ich habe versucht, das Zugriffsprotokoll mit Node.js auf dem Server auszugeben
Ich habe das TensorFlow-Tutorial als erstes ausprobiert
Ich habe die Naro-Roman-API 2 ausprobiert
Ich habe den Mechanismus der Flaschenanmeldung untersucht!
Ich habe versucht, GrabCut von OpenCV zu verwenden
Ich habe das 2. TensorFlow-Tutorial ausprobiert
Ich habe die neuartige API von Naruro ausprobiert
Die Geschichte des erneuten Bereitstellens des Anwendungsservers
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, asynchrone Verarbeitung mit Asyncio
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, den WEB-Server der normalen Linux-Programmierung 1st Edition mit C ++ 14 neu zu schreiben
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
[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
Ablauf des Ergebnisses der asynchronen Verarbeitung mit Django und Sellerie
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Ich habe mir die Metainformationen von BigQuery angesehen und versucht, sie zu verwenden
Ich habe versucht, E-Mails vom Sakura-Server mit Flask-Mail zu senden