Я пытаюсь настроить веб-сокет для уведомления в реальном времени. Мой Frontend - Angular, Backend - Django, используя docker как для внутреннего, так и для внешнего интерфейса. На локальном компьютере он работает отлично. Соединение успешно установлено. sh и сигнал может передавать / транслировать.
Но когда я развернул его на сервере, это вызвало ошибку 200
Вот код подключения к бэкэнду:
main -> routers.py
application = ProtocolTypeRouter({
# (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter(
sog.notification.routing.websocket_urlpatterns
)
),
})
app -> routers.py
websocket_urlpatterns = [
re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer )
]
consumer.py
class ChatConsumer(WebsocketConsumer):
def connect(self):
self.room_name = self.scope['url_route']['kwargs']['room_name'] #usename
self.room_group_name = self.room_name
async_to_sync(self.channel_layer.group_add)(
self.room_group_name, self.channel_name)
self.accept()
def disconnect(self, close_code):
async_to_sync(self.channel_layer.group_discard)(
self.room_group_name,
self.channel_name
)
# Receive message from WebSocket
def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json['message']
# Send message to room group
async_to_sync(self.channel_layer.group_send)(
self.room_group_name,
{
'type': 'chat_message',
'message': message
}
)
Вот код Frontend:
Пока я нахожусь на локальной машине. Во Frontend я написал WEB-SOCKET URL: wss: // localhost: 8000 / ws / chat / notification _ '+ authService.getUsername () Для сервера я использовал: wss: // domain .com / ws / chat / notification _ '+ authService.getUsername ()
websocket.service.ts
import { Injectable } from "@angular/core";
import * as Rx from "rxjs/Rx";
@Injectable()
export class WebsocketService {
constructor() {}
private subject: Rx.Subject<MessageEvent>;
public connect(url): Rx.Subject<MessageEvent> {
if (!this.subject) {
this.subject = this.create(url);
console.log("Successfully connected: " + url);
}
return this.subject;
}
private create(url): Rx.Subject<MessageEvent> {
let ws = new WebSocket(url);
let observable = Rx.Observable.create((obs: Rx.Observer<MessageEvent>) => {
ws.onmessage = obs.next.bind(obs);
ws.onerror = obs.error.bind(obs);
ws.onclose = obs.complete.bind(obs);
return ws.close.bind(ws);
});
let observer = {
next: (data: Object) => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify(data));
}
}
};
return Rx.Subject.create(observer, observable);
}
}
notification.service.ts
@Injectable()
export class NotificationService extends AbstractService {
public messages;
constructor(wsService: WebsocketService,
authService: AuthService,
http: HttpClient)
{
super(http);
this.messages = <Subject<Message>>wsService.connect('wss://domain.com/ws/chat/notification_'+ authService.getUsername() + '/').map(
(response: MessageEvent): Message => {
let data = JSON.parse(response.data);
return data
}
);
}
}
Спасибо заранее.