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-конфиге.