[PYTHON] Pour fêter la sortie de Django 3.0, j'ai essayé ASGI, le successeur spirituel de WSGI, mais le socket Web n'a pas fonctionné.

Fête! Django 3.0 est sorti!

02/02/2019 Django 3.0 est sorti. Django 1.0 est sorti en 2008 et 2.0 en décembre 2017. Et la version 3.0 est sortie le 2 décembre de cette année. Il a fallu environ 10 ans pour passer de 1 à 2, mais c'était une vitesse surprenante de moins de 2 ans de 2 à 3. Qu'est-ce que j'ai fait ces deux dernières années par rapport à ça? Jetons maintenant un œil aux nouvelles fonctionnalités qui me tiennent à cœur dans Django 3.0!

Qu'est-ce que le support ASGI?

J'étais curieux à ce sujet. Cela dit, je n'ai jamais touché à l'ASGI et l'ai officiellement soutenu! Même si on me l'a dit, c'était comme ça. Mais j'ai WSGI-san ... Cependant, quand je l'ai recherché, il m'a semblé que l'ASGI semblait être quelque chose qui ne pouvait être ignoré.

Selon la Note de publication, la fonction asynchrone n'est pas actuellement dans WSGI et n'est prise en charge que lorsqu'elle est exécutée dans ASGI. (Mais pensez-vous que nous le soutiendrons à l'avenir?). Officiel ASGI dit: "ASGI est le successeur spirituel du WSGI (suite spirituelle. wiki /% E7% B2% BE% E7% A5% 9E% E7% 9A% 84% E7% B6% 9A% E7% B7% A8)) ". De cette façon, WSGI, qui semblait être mon allié fort, semble être rétrocompatible avec ASGI.

Ce n'est pas grave, mais le mot «suite spirituelle» est cool. Il semble que Xenosaga pour Xenogias, Perfect Dark pour Golden Eye 007, etc. y correspondent. Cependant, WSGI et ASGI ne sont pas des jeux ou des œuvres de fiction, et la suite est-elle vraiment adaptée? J'ai pensé, alors je vais le lire comme un successeur spirituel. Je l'ai écrit dans le titre.

Essayez d'exécuter Django avec ASGI

Si c'était décidé, l'histoire serait rapide, alors j'ai essayé d'exécuter Django avec ASGI. Créez un environnement avec Docker.

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

J'utilise python3.8. À propos, Django 3.0 prend en charge python 3.6, 3.7 et 3.8.

pip install django daphne

Installez daphne avec django. daphne ressemble à un serveur pour ʻASGI. Le ʻu WSGI dans le WSGI est probablement le daphné dans le ʻASGI`. sûrement. À propos, daphné semble s'appeler daphné. Même si django est un django, le d de daphné doit être prononcé correctement.

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

Après l'installation, créez un projet et essayez de l'exécuter immédiatement.

Hourra! déplacé! Fini!

django3.png

Cela a fonctionné, mais je ne sais pas ce qui me rend heureux. Oui bien sur. Même si la fonction asynchrone est à vendre, elle ne communique que de manière synchrone.

N'y a-t-il pas un tutoriel comme la création d'une application de chat qui vous permet d'essayer la communication asynchrone avec Django?

était. https://channels.readthedocs.io/en/latest/tutorial/index.html Lorsque les canaux Django sont utilisés, il semble que le socket Web puisse être utilisé avec Djang, et il existe un didacticiel d'application de chat poli. C'est mon âme d'essayer d'exécuter une application de chat créée en copiant ceci avec daphne. Cependant, je ne suis pas sûr de la relation entre les canaux Django et ce support ASGI. Eh bien, mais n'allez pas trop loin car vous pourriez le découvrir en l'utilisant.

Placez le produit fini créé selon le tutoriel ici ici. J'essaierai de le déplacer. Il est dans l'état command: python manage.py runserver 0.0.0.0: 8000.

sudo docker-compose up -d

J'ai confirmé l'opération avec 2 fenêtres, mais je peux utiliser le chat correctement.

mov2.gif

Maintenant, déplaçons cela avec daphne. Réécrivez «command» comme suit:

 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:

Cela devrait fonctionner comme je m'y attendais ...

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

ws.png Hmm, ça ne marche pas.

Quand je lis le message d'erreur, il dit que websocket ne peut pas être utilisé.

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/" - -

Jetons un coup d'œil autour de la ligne 144 de 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']
            )

Il semble qu'il lève une exception lorsqu'il ne s'agit pas de connexions HTTP. Qu'est-ce que c'est que ça?

Je pense que c'est non plus, mais je ne suis pas sûr. Le mystère ne fait que s'approfondir. Cependant, il est officiellement déclaré que ASGI peut prendre en charge Django de manière asynchrone, je continuerai donc à y porter une attention particulière.

fin

Au revoir WSGI. J'ai ASGI ...

Recommended Posts

Pour fêter la sortie de Django 3.0, j'ai essayé ASGI, le successeur spirituel de WSGI, mais le socket Web n'a pas fonctionné.
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé de corriger la forme trapézoïdale de l'image
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é d'utiliser Resultoon sur Mac + AVT-C875, mais j'étais frustré en chemin.
J'ai essayé de résumer comment utiliser matplotlib de python
J'ai essayé de gratter YouTube, mais je peux utiliser l'API, alors ne le faites pas.
Je veux faire défiler la table de décalage Django, mais ...
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de classer les voix des acteurs de la voix
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é d'obtenir les informations de localisation du bus Odakyu
Je souhaite utiliser uniquement le traitement de normalisation SudachiPy
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai essayé de résumer comment utiliser à nouveau le référentiel EPEL
J'ai essayé de décrire le trafic en temps réel avec WebSocket
[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
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai comparé Jinja2 en lisant le document pour l'utiliser avec Django
J'ai essayé de visualiser la condition commune des téléspectateurs de la chaîne VTuber
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
Je veux utiliser quatre règles compliquées dans l'instruction IF du modèle Django! → Utilisez un modèle personnalisé
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé de transcrire les actualités de l'exemple d'intégration commerciale sur Amazon Transcribe
J'ai essayé d'estimer la similitude de l'intention de la question en utilisant Doc2Vec de gensim
J'ai essayé d'améliorer la précision de mon propre réseau neuronal
J'ai essayé de résoudre 100 traitements linguistiques Knock version 2020 [Chapitre 3: Expressions régulières 25-29]
Je souhaite utiliser Django Debug Toolbar dans les applications Ajax
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
J'ai essayé de résumer la manière logique de penser l'orientation objet.
J'ai essayé de trouver l'itinéraire optimal du pays des rêves par recuit (quantique)
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé d'obtenir automatiquement le RSS de la chanson la plus populaire de l'iTunes Store
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
Je voulais utiliser le module de recherche d'Ansible2, mais cela a pris du temps, alors prenez note
L'arbre.plot_tree de scikit-learn était très simple et pratique, j'ai donc essayé de résumer comment l'utiliser facilement.
J'ai essayé de résumer la commande umask
Comment vérifier la version de Django
J'ai essayé de reconnaître le mot de réveil