Django Channels эквивалентный код для javax.websocket
Я новичок в Django Channels. Я пытаюсь повторить то, что сделано в этом Java-коде, используя Django Channels. Но я не могу понять, как отправить сообщение JSON на фронтенд Angular.
Во фронтенде есть таблица, которая будет обновляться через реализацию websocket. Но метод recieve
, похоже, не повторяет то, что делал метод onMessage
. Django Channels выполняет успешное рукопожатие. Но это все, что происходит.
Java Code
@ServerEndpoint("/socket/order")
@ApplicationScoped
public class OrderSocket {
Set<Session> sessions = new HashSet<>();
@OnOpen
public void onOpen(Session session) {
LOG.debug("onOpen " + session.getId());
sessions.add(session);
}
@OnClose
public void onClose(Session session) {
LOG.debug("onClose " + session.getId());
sessions.remove(session);
}
@OnError
public void onError(Session session, Throwable throwable) {
LOG.debug("onError " + session.getId() + " left on error: " + throwable);
sessions.remove(session);
}
@OnMessage
public void onMessage(String message) {
LOG.debug("onMessage " + message);
broadcast(message);
}
public void broadcast(OrderDto orderDto) {
Jsonb jsonb = JsonbBuilder.create();
String jsonString = jsonb.toJson(orderDto);
broadcast(jsonString);
}
private void broadcast(String message) {
sessions.forEach(s -> {
LOG.debug("Message broadcasted: " + message);
s.getAsyncRemote().sendObject(message, result -> {
if (result.getException() != null) {
LOG.error("Unable to send message: " + result.getException());
}
});
});
}
}
Код Python
consumer.py
class OrderConsumer(WebsocketConsumer):
log = logging.getLogger('main')
def connect(self):
self.log.debug("onOpen")
self.accept()
def receive(self, text_data=None, bytes_data=None):
self.log.debug("onMessage " + text_data)
self.send(text_data="Message = " + text_data)
def disconnect(self, code):
self.log.debug("onClose")
return super().disconnect(code)
Типичный код
export class OrderWebSocketService {
private API_URL = environment.API_URL;
private SOCKET_URL = this.API_URL.replace(/http/gi, "ws");
myWebSocket: WebSocketSubject<Order> = webSocket(this.SOCKET_URL + 'socket/order/');
constructor(private snackBar: MatSnackBar) { }
public connect(): Observable<Order> {
return this.myWebSocket.asObservable().pipe(
map((obj) => obj),
catchError((error) => this.errorHandler(error))
);
}
public close(): void {
this.myWebSocket.complete();
}
errorHandler(e: any): Observable<any> {
this.showMessage('Something wrong happened with websocket!', true);
return EMPTY;
}
showMessage(msg: string, isError: boolean = false): void {
this.snackBar.open(msg, 'X', {
duration: 3000,
horizontalPosition: "right",
verticalPosition: "top",
panelClass: isError ? ['msg-error'] : ['msg-success']
});
}
}
Буду признателен за любые предложения.