Проблемы с Django Channels и подключением к Flutter
Проблема: При попытке подключения к каналам я получаю ошибку в flutter:
WebSocketChannelException: WebSocketException: Connection to 'http://"###my ip ###":8000/ws/joingroup/8598969d-3dfa-4017-849c-dcbb71c1f9f0/#' was not upgraded to websocket
Я использую пакет websocket channel и в контроллере flutter у меня есть:
WebSocketChannel? channel; //initialize a websocket channel
bool isWebsocketRunning = false;
void startStream() async {
if (isWebsocketRunning) return; //check if socket running
var url = 'ws://${ip}:8000/ws/joingroup/${Get.parameters['groupid']}/';
this.channel = WebSocketChannel.connect(
Uri.parse(url), //connect to a websocket
);
channel!.stream.listen(
(event) {
print(json.decode(event));
},
onDone: () {
isWebsocketRunning = false;
},
onError: (error) {
debugPrint('ws error $error');
}
);
}
вопрос 1) почему написано "http://...", когда я четко указал, что это ws url.
в бэкэнде я использую каналы django. app routing::
from django.urls import re_path
from django.urls import path
#this is utilizing relative paths. this is more advanced paths.
#
from . import consumers
websocket_urlpatterns = [
path('ws/joingroup/<slug:groupid>/', consumers.ChatConsumer )
]
и маршрутизация для проекта:
# mysite/routing.py
from channels.auth import AuthMiddlewareStack
#hooking into auth that django provides^
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
import myapp.routing
from django.core.asgi import get_asgi_application
# the allowedhosts is for what ever is in your allowehost in setting.py
application = ProtocolTypeRouter({
# (http->django views is added by default)
#"http": get_asgi_application(),
'websocket': AllowedHostsOriginValidator(
#AuthMiddlewareStack(
URLRouter(
myapp.routing.websocket_urlpatterns
# )
)
),
})
Итак, что происходит: я пытаюсь установить соединение. и оно начинает квитирование. затем сразу же отклоняется и разъединяется.
2) Связано ли это с тем, что я не обеспечил аутентификацию сокета через заголовок? Или есть что-то, что я упустил на стороне flutter. Примечание: мои обычные Http запросы работают отлично.
- is there a way to add header to authenticate with TOKEN when sending a connect attempt with a websocet. in (webSocketCHannel.connect(...)
заранее спасибо, я знаю, что это длинный пост!!!