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.
3 Réponses :
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 \
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.
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.
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.