我正在构建的 Django Channels 项目的路线不起作用,此时我不知道为什么。对我来说一切似乎都很好,但我一遍又一遍地从服务器收到相同的错误。
我知道我缺少一些东西,但那会是什么?
ASG 设置
import os
from channels.routing import ProtocolTypeRouter
from channels.routing import URLRouter
from channels.auth import AuthMiddlewareStack
from django.core.asgi import get_asgi_application
from chat import routing
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "base_app.settings")
# Handles routing protocols for Django Channels
application = ProtocolTypeRouter(
{
"http": get_asgi_application(),
# Points root routing to chat/routing.py
"websocket": AuthMiddlewareStack(URLRouter(routing.websocket_urlpatterns)),
}
)
渠道路线
# chat/routing.py
from django.urls import re_path, path
from .consumer import ChatConsumer
websocket_urlpatterns = [
re_path(r"ws/chat/(?P<chat_id>\d+)/$", ChatConsumer.as_asgi()),
]
渠道消费者
# chat/consumer.py
import json
from django.contrib.auth import get_user_model
from channels.generic.websocket import WebsocketConsumer
from asgiref.sync import async_to_sync
from chat.models import Message
from chat.views import last_10_messages
# Instantiate user model
User = get_user_model()
class ChatConsumer(WebsocketConsumer):
"""Chat consumer class process data sent from WebSocket routing"""
# === Utility === <---------------- Scroll down to see main Channel's methods
def fetch_messages(self, data):
"""Fetch last messages from database"""
messages = last_10_messages(data["chatID"])
serialized_messages = {
"command": "fetch_messages",
"messages": self.messages_to_json(messages),
}
# Send fetched messages
self.send_message(message=serialized_messages)
def new_message(self, data):
"""Stores and new message"""
author = data["from"]
author_is_authenticate = User.objects.filter(username=author)[0]
# Store and return new message
message = Message.objects.create(
author=author_is_authenticate, content=data["message"]
)
content = {"command": "new_message", "message": self.message_to_json(message)}
return self.send_chat_message(content)
def messages_to_json(self, messages):
results = []
for message in messages:
results.append(self.message_to_json(message))
return results
def message_to_json(self, message):
return {
"id": message.id,
"author": message.contact.user.username,
"content": message.content,
"timestamp": str(message.timestamp),
}
# Chat consumer commands
commands = {"fetch_messages": fetch_messages, "new_message": new_message}
# === Main ===
def connect(self):
self.chat_id = self.scope["url_route"]["kwargs"]["chat_id"]
self.room_group_name = "chat_%s" % self.chat_id
# Join room group
async_to_sync(self.channel_layer.group_add)(
self.room_group_name, self.channel_name
)
self.accept()
def disconnect(self, close_code):
# Leave room group
async_to_sync(self.channel_layer.group_discard)(
self.room_group_name, self.channel_name
)
def receive(self, text_data):
"""Receive message from WebSocket"""
data = json.loads(text_data)
self.commands[data["command"]](self, data)
def send_chat_message(self, message):
"""Send message to room group"""
async_to_sync(self.channel_layer.group_send)(
self.room_group_name, {"type": "chat_message", "message": message}
)
def send_message(self, message):
# Send message to WebSocket
self.send(text_data=json.dumps(message))
def chat_message(self, event):
# Receive message from room group
message = event["message"]
# Send message to WebSocket
self.send(text_data=json.dumps(message))
错误回溯
Exception inside application: No route found for path ''.
Traceback (most recent call last):
File "c:\projects\chatter\venv\lib\site-packages\channels\staticfiles.py", line 44, in __call__
return await self.application(scope, receive, send)
File "c:\projects\chatter\venv\lib\site-packages\channels\routing.py", line 71, in __call__
return await application(scope, receive, send)
File "c:\projects\chatter\venv\lib\site-packages\channels\sessions.py", line 47, in __call__
return await self.inner(dict(scope, cookies=cookies), receive, send)
File "c:\projects\chatter\venv\lib\site-packages\channels\sessions.py", line 254, in __call__
return await self.inner(wrapper.scope, receive, wrapper.send)
File "c:\projects\chatter\venv\lib\site-packages\channels\auth.py", line 181, in __call__
return await super().__call__(scope, receive, send)
File "c:\projects\chatter\venv\lib\site-packages\channels\middleware.py", line 26, in __call__
return await self.inner(scope, receive, send)
File "c:\projects\chatter\venv\lib\site-packages\channels\routing.py", line 168, in __call__
raise ValueError("No route found for path %r." % path)
ValueError: No route found for path ''.
WebSocket DISCONNECT / [127.0.0.1:3378]