Я начинающий с Джанго.Я хотел бы использовать веб-сокеты с каналами.Таким образом, я следую этому учебнику , чтобы создать простой чат.
Я показываю вам свои файлы.
chat / consumer.py
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
}))
Мой файл шаблона room.html:
<!-- 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>
Конфигурация корневой маршрутизации:
# 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
)
),
})
И мой файл routing.py:
# chat/routing.py
from django.conf.urls import url
from . import consumers
websocket_urlpatterns = [
url(r'^ws/chat/(?P<room_name>[^/]+)/$', consumers.ChatConsumer),
]
Когда я запускаю свой сервер ASGI и попадаю на страницу http://127.0.0.1:8000/chat/Test/, я получаю следующее сообщение об ошибке:
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]
Не могли бы вы представить себепроблема?:)
Этот вопрос похож, но ответа не было.
Спасибо!
РЕДАКТИРОВАТЬ
Я замечаю странную вещь: если я добавлю неправильный код в мой файл routing.py, сервер этого не заметит.Как будто он не читает этот файл.Например, если я включу файл routing.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
]
На сервере не отображается сообщение об ошибке.