Web Socket через ошибку рукопожатия подключения, статус: 200 на производстве, в то время как на локальном работает нормально, Django + Angular - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь настроить веб-сокет для уведомления в реальном времени. Мой 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
      }
    );
  }
}

Спасибо заранее.

...