1
votes

Déconnexion Websocket avec les canaux dans Django

Je suis débutant avec Django. Je souhaite utiliser des websockets avec des canaux. De cette façon, je suis ce tutoriel pour créer un chat simple .

Je vous montre mes fichiers.

chat / consumer.py

# chat/routing.py
from django.conf.urls import url

from . import consumers

websocket_urlpatterns = [
    url(r'^ws/chat/(?P<room_name>[^/]+)/$', consumers.ChatConsumer),ezvzev
]

Mon fichier de modèle room.html :

HTTP GET /chat/Test/ 200 [0.00, 127.0.0.1:2807]
[Failure instance: Traceback: <class 'ValueError'>: No application configured for scope type 'websocket'
C:\Users\kevin\Envs\myproject\lib\site-packages\autobahn\websocket\protocol.py:2801:processHandshake
C:\Users\kevin\Envs\myproject\lib\site-packages\txaio\tx.py:429:as_future
C:\Users\kevin\Envs\myproject\lib\site-packages\twisted\internet\defer.py:151:maybeDeferred
C:\Users\kevin\Envs\myproject\lib\site-packages\daphne\ws_protocol.py:82:onConnect
--- <exception caught here> ---
C:\Users\kevin\Envs\myproject\lib\site-packages\twisted\internet\defer.py:151:maybeDeferred
C:\Users\kevin\Envs\myproject\lib\site-packages\daphne\server.py:198:create_application
C:\Users\kevin\Envs\myproject\lib\site-packages\channels\staticfiles.py:41:__call__
C:\Users\kevin\Envs\myproject\lib\site-packages\channels\routing.py:61:__call__
]
WebSocket DISCONNECT /ws/chat/Test/ [127.0.0.1:2814]

Configuration du routage racine:

# chat/routing.py
from django.conf.urls import url

from . import consumers

websocket_urlpatterns = [
    url(r'^ws/chat/(?P<room_name>[^/]+)/$', consumers.ChatConsumer),
]

Et mon fichier routing.py:

# mysite/routing.py
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import chat.routing

application = ProtocolTypeRouter({
        # (http->django views is added by default)
        'websocket': AuthMiddlewareStack(
        URLRouter(
        chat.routing.websocket_urlpatterns
        )
        ),
    })

Lorsque j'exécute mon serveur ASGI et que j'arrive sur la page http : //127.0.0.1: 8000 / chat / Test / , j'obtiens le message d'erreur suivant:

<!-- chat/templates/chat/room.html -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Chat Room</title>
</head>
<body>
    <textarea id="chat-log" cols="100" rows="20"></textarea><br/>
    <input id="chat-message-input" type="text" size="100"/><br/>
    <input id="chat-message-submit" type="button" value="Send"/>
</body>
<script>
    var roomName = {{ room_name_json }};

    var chatSocket = new WebSocket(
        'ws://' + window.location.host +
        '/ws/chat/' + roomName + '/');

    chatSocket.onmessage = function(e) {
        var data = JSON.parse(e.data);
        var message = data['message'];
        document.querySelector('#chat-log').value += (message + '\n');
    };

    chatSocket.onclose = function(e) {
        console.error('Chat socket closed unexpectedly');
    };

    document.querySelector('#chat-message-input').focus();
    document.querySelector('#chat-message-input').onkeyup = function(e) {
        if (e.keyCode === 13) {  // enter, return
            document.querySelector('#chat-message-submit').click();
        }
    };

    document.querySelector('#chat-message-submit').onclick = function(e) {
        var messageInputDom = document.querySelector('#chat-message-input');
        var message = messageInputDom.value;
        chatSocket.send(JSON.stringify({
            'message': message
        }));

        messageInputDom.value = '';
    };
</script>
</html>

Auriez-vous un idée du problème? :)

Ceci question est similaire, mais aucune réponse n'a été fournie.

Merci!

MODIFIER

Je remarque une chose étrange, si je mets un mauvais code dans mon fichier routing.py, le serveur ne le remarque pas. C'est comme s'il ne lisait pas ce fichier. Par exemple, si je tourne le fichier routing.py comme ceci:

from channels.generic.websocket import WebsocketConsumer
import json

class ChatConsumer(WebsocketConsumer):
    def connect(self):
        self.accept()

    def disconnect(self, close_code):
        pass

    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        self.send(text_data=json.dumps({
            'message': message
        }))

Le serveur n'affiche aucun message d'erreur.


0 commentaires

3 Réponses :


0
votes

J'ai trouvé mon erreur ... J'ai mis le fichier routing.py à l'intérieur du premier répertoire: sitetest \ Alors que je devais le mettre dans sitetest \ sitetest \


0 commentaires

3
votes

J'ai eu la même erreur. Je suppose que nous suivons tous les deux le même tutoriel.

Pour moi, c'était le signe dollar supplémentaire à la fin du chemin dans chat / routing.py:

# chat/routing.py
from django.conf.urls import url

from . import consumers

websocket_urlpatterns = [
    path('ws/chat/<str:room_name>/$', consumers.ChatConsumer),
]

Lorsque le "$" a été supprimé, tout fonctionnait.


1 commentaires

Le signe $ marque la fin d'une expression régulière. Pour que cela fonctionne, vous devez utiliser re_path, le re représente l'expression régulière.



0
votes

J'ai le même problème. Ceci est mon routing.py:

  from django.urls import re_path

  from .consumers import ChatConsumer

  websocket_urlpatterns = [
     re_path(r'^ws/chat/(?P<room_name>[^/]+)/', ChatConsumer),
  ]

Et j'ai suivi le même tutoriel avec le même code de cette question.


0 commentaires