[Fixed]-Django-channels: No route found for path

14๐Ÿ‘

You need to use url, I had the same problem:

Not working

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

Working

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

7๐Ÿ‘

Try something like this:

routing.py (Inside your django app folder)

from django.urls import path
from core import consumers

websocket_urlpatterns = [
    path('ws/rooms/<uri>/', consumers.ChatConsumer),
]

routing.py (Same level as your settings.py)

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import myapp.routing

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

And lastly in your settings.py

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [REDIS_URL],
        },
    },
}

INSTALLED_APPS.append('channels')
ASGI_APPLICATION = 'myapp.routing.application'
๐Ÿ‘คGiannis Katsini

6๐Ÿ‘

I met the same problem as you,and just now I happened to solve it!
in my ws_client.py I wrote this

ws.create_connection("ws://127.0.0.1:8000/alarm")

and in routing.py I changed to this below and it worked

from django.urls import path
channel_routing = [
    path('alarm',consumers.ws_message),
    # before I wrote 'alarm/', I just change from alarm/ to alarm
]

and it worked! you can try it

๐Ÿ‘คLittleCabbage

2๐Ÿ‘

To anyone new that may be facing this issue. Donโ€™t use the path pattern matcher with a regular expression. If you wish to do use, use either url or re_path instead.

using path

Match pattern without trailing or leading slash (/) and make sure pattern corresponds with client web socket URL

websocket_urlpatterns = [
    path("ws/chat/<int:uri>", ChatConsumer.as_asgi()),
]

Using re_path or url

Match pattern without trailing slash (/).

url(r'^ws/chat/(?P<uri>[^/]+)/$', ChatConsumer.as_asgi()),

NOTE: I advise using path because itโ€™s easier to match patterns and read.

๐Ÿ‘คRomeo

1๐Ÿ‘

Removing the slash from the app.routing routes file solved the problem, I guess it was being counted a duplicate slash in the URL of that socket.

For instance, I had:

url(r'/ws/documents/get-df', consumers.DFConsumer.as_asgi())

This was not working, but it worked when I removed the first slash before was

url(r'ws/documents/get-df', consumers.DFConsumer.as_asgi())
๐Ÿ‘คAli H. Kudeir

0๐Ÿ‘

i had similar issue and added .as_asgi() and it worked

url(r"messages/(?P<username>[\w.@+-]+)/", ChatConsumer.as_asgi()),

๐Ÿ‘คVictor Joseph

0๐Ÿ‘

you may need to restart the services, seems it would not automatic reload.

๐Ÿ‘คLeon Mu

0๐Ÿ‘

I spent like more than an hour to this problem and I found out that django project my default doesnโ€™t take asgi.py configuration settings in consideration.

  1. Install daphne into your project
    python -m pip install daphne

  2. list into your INSTALLED_APPS array

INSTALLED_APPS = [
    "daphne",
    ...,
]
  1. Mentioned asgi application object

ASGI_APPLICATION = "myproject.asgi.application"

Run your project and see if it connects with your websocket.

For context, my asgi.py file is like this

import os

from django.core.asgi import get_asgi_application
from django.urls import path
from channels.routing import ProtocolTypeRouter, URLRouter

from chat_app.routing import ChatConsumer


os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'teacher_gpt_chat.settings')

websocket_urlpatterns = [
    path('ws/chat', ChatConsumer.as_asgi())
]

application = ProtocolTypeRouter(
    {
        "http": get_asgi_application(),
        "websocket": URLRouter(websocket_urlpatterns),
    }
)
๐Ÿ‘คRaj Patel

Leave a comment