[PYTHON] J'ai essayé le serveur asynchrone de Django 3.0

Préface

maxresdefault.jpg

Django 3.0 est officiellement sorti il y a 3 jours. Relâchez le lien du nœud Avec autant de changements, je suis très intéressé par l'ajout de la prise en charge de ʻASGI`, J'aimerais vraiment l'utiliser. : ensoleillé:

Remarque: Qu'est-ce que ASGI?: Mallette:

ASGI (Asynchronous Server Gateway Interface) est le successeur spirituel de WSGI et vise à fournir une interface standard entre les serveurs Web Python asynchrones, les frameworks et les applications.

Alors que WSGI fournissait la norme pour les applications Python synchrones, ASGI fournit à la fois des applications asynchrones et synchrones avec une implémentation de compatibilité descendante de WSGI et de plusieurs serveurs et cadres d'application.

Lien du document

Nouveau projet

Créer un environnement virtuel pour les tests

 mkvirtualenv django3.0

Installez Django

 pip3 install django

Une fois l'installation terminée, assurez-vous que vous disposez de Django 3.0

(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

Créons un nouveau projet et démarrons un serveur

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

Accédons au n ° 8000 et vous pourrez voir la fusée familière.

UNADJUSTEDNONRAW_thumb_38.jpg Jusqu'ici Yoshi!: Détendu :: point_up:

Voyons le document officiel

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)

Lien

En gros résumé

Ouvrons le lien officiel pour voir ce qu'est «Daphne» lien

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.

Traduit --Installez daphné avec pip --Exécuter daphne myproject.asgi: application pour démarrer le serveur ASGI --Accès à 127.0.0.1.8000

Essayons: point_up:

Démarrer le serveur ASGI

installation de daphné

 pip3 install daphne

Démarrage du serveur

daphne [Nom du projet].asgi:application

Quand j'ai accédé à 8000, j'ai pu revoir la fusée, même si les personnages ont un peu changé. : œil:

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

Test WebSocket

Je vais ouvrir un navigateur et envoyer un message Websocket. UNADJUSTEDNONRAW_mini_3b.jpg

«500» est renvoyé, le message d'erreur est le suivant.

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.

Il semble y avoir quelque chose à la ligne 146 de ʻasgi.py`, jetons un œil.

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

Notez le commentaire de deux lignes ci-dessous.

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

Pour le moment, seule la communication http est autorisée. Veuillez le réparer vous-même si nécessaire!

dernier

Les causes possibles sont les suivantes.

Django 3.0 actuel, si vous souhaitez utiliser websocket, nous vous recommandons d'utiliser le package django-channel.

Recommended Posts

J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé Django
J'ai essayé l'analyse par grappes de la carte météo
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai vérifié la période de rétention de session de django
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de résumer les paramètres des différentes bases de données de Django (MySQL, PostgreSQL)
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé le tutoriel MNIST de tensorflow pour les débutants.
J'ai essayé la bibliothèque changefinder!
J'ai essayé d'utiliser l'API de Sakenowa Data Project
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de gratter la publicité du site de dessin animé piraté
J'ai essayé la méthode la plus simple de classification de documents multi-étiquettes
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé d'exécuter l'exemple de code du module Ansible
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de trouver l'entropie de l'image avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai participé à l'activité de traduction du document officiel Django
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de démarrer le serveur de Django avec VScode au lieu de Pycharm
J'ai essayé de refactoriser le modèle CNN de TensorFlow en utilisant TF-Slim
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
J'ai essayé l'analyse morphologique du commentaire général du putain de jeu de l'année
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
Trouvé la cause de la communication mystérieuse du serveur Minecraft (Spigot)
J'ai essayé un peu le comportement de la fonction zip
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai affiché le chat de YouTube Live et essayé de jouer
J'ai essayé de sortir le journal d'accès au serveur en utilisant Node.js
J'ai essayé le tutoriel TensorFlow 1er
J'ai essayé le roman Naro API 2
J'ai étudié le mécanisme de connexion flask!
J'ai essayé d'utiliser GrabCut d'OpenCV
J'ai essayé le tutoriel TensorFlow 2ème
J'ai essayé l'API du roman Naruro
L'histoire du remontage du serveur d'application
J'ai essayé de déplacer le ballon
J'ai essayé d'utiliser l'API checkio
J'ai essayé le traitement asynchrone en utilisant asyncio
J'ai essayé d'estimer la section.
J'ai essayé de réécrire le serveur WEB de la 1ère édition de programmation Linux normale avec C ++ 14
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
Flux d'obtention du résultat du traitement asynchrone à l'aide de Django et Celery
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai regardé les méta-informations de BigQuery et essayé de les utiliser
J'ai essayé d'envoyer du courrier depuis le serveur Sakura avec flask-mail