WebSocket каналы django не работают с postman

Django Channels Выбрасывает ошибку с postman, в то время как хорошо работает с Html.

Я следую Django Socket Tutorial

"вот ошибка, показанная в Django".

WebSocket HANDSHAKING /ws/chat/roomName/ [127.0.0.1:56504]
WebSocket REJECT /ws/chat/roomName/ [127.0.0.1:56504]
WebSocket DISCONNECT /ws/chat/roomName/ [127.0.0.1:56504]

"Ошибка отображается в postman при подключении к ws://127.0.0.1:8000/ws/chat/roomName/"

Sec-WebSocket-Version: 13
Sec-WebSocket-Key: fSSuMD2QozIrgywqTX38/A==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: 127.0.0.1:8000

Мой код asgi.py

django_asgi_app = get_asgi_application()

import digital_signage.playlist_management.routing

application = ProtocolTypeRouter(
    {
        "http": django_asgi_app,
        "websocket": AllowedHostsOriginValidator(
            AuthMiddlewareStack(URLRouter(digital_signage.playlist_management.routing.websocket_urlpatterns))
        ),
    }
)

consumer.py

class ChatConsumer(WebsocketConsumer):
    def connect(self):
        print("self", self)
        self.accept()

Это происходит из-за ALLOWED_HOST в настройках. Вы можете поставить *, если вы находитесь в режиме разработки, но это повлияет на весь проект. Вместо этого вы можете сделать что-то вроде следующего

Вы можете обернуть asgi.py с OriginValidator (можно импортировать из channels.security.websocket)

application = ProtocolTypeRouter(
{
    "http": django_asgi_app,
    "websocket": OriginValidator(
        AuthMiddlewareStack(
            URLRouter(Chat.routing.websocket_urlpatterns)
        ),
        ['*']
    )
    
}

)

Пройдя через модуль \channels\security\websocket.py, модуль Channels OriginValidator ищет заголовок origin, а не заголовок hosts, который Postman использует по умолчанию.

Предполагая, что ваш ALLOWED_HOSTS выглядит так:

ALLOWED_HOSTS = ["localhost", "127.0.0.1"]

Затем в Postman в заголовках добавьте:

origin:http://127.0.0.1:8000

И это пройдет валидатор происхождения без необходимости изменять разрешенные хосты в Django или ASGI-конфиге.

Вернуться на верх