1

我正在构建的 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]
4

1 回答 1

0

尝试这个:

首先从导入AllowedHostsOriginValidatorchannels.security.websocket

from channels.security.websocket import AllowedHostsOriginValidator

然后将AuthMiddlewareStack课程传递给AllowedHostsOriginValidator.

# Handles routing protocols for Django Channels
application = ProtocolTypeRouter(
    {
        "http": get_asgi_application(),

        # Points root routing to chat/routing.py
        "websocket": AllowedHostsOriginValidator
           AuthMiddlewareStack(
              URLRouter(routing.websocket_urlpatterns)
           )
        ),
    }
)
于 2021-08-28T21:38:10.760 回答