django - 带有 Spring Boot Websockets (StompSession) 的 Django 通道不起作用
问题描述
嘿,我们想使用 Django 来执行 python 代码并使用通道来获取结果。实现了 websocket 无法正常工作的所有内容。如果我尝试从我们的 Angular 前端向 Django 发送一些东西,它工作正常。否则,我们的 Spring Boot StompSession Websocket 可以与其他 Spring Boot 应用程序和 Angular 一起正常工作。
但是 Django 3.1.3 和 Spring Boot 2.3.3 没有。此外,还使用了 channels 3.0.2、channels-redis 3.2.0 和 redis 6 的 docker 容器。
我可以从 Django 服务器日志中看到:
WebSocket HANDSHAKING /ws/card-detection/ [127.0.0.1:53209]
i'm in connect method
WebSocket CONNECT /ws/card-detection/ [127.0.0.1:53209]
i'm in receive method
text_data: CONNECT
这会在 websocket 请求进入时立即执行。
django 消费者(没有上面记录的打印):
class MyConsumer(WebsocketConsumer):
groups = ["broadcast"]
def connect(self):
self.accept()
def receive(self, text_data=None, bytes_data=None):
self.send(text_data="Hello world!")
def disconnect(self, close_code):
pass
从 Spring Boot 我们发送一个 base64 编码的图像。但其他一切都不起作用。如您所见,text_data
只是CONNECT
.
弹簧靴:
StompSessionHandler sessionHandler =
new CardDetectionStompSessionHandler(request, user, webSocketMessagingService);
createStompClient().connect(djangoServiceWSPath, sessionHandler);
}
private WebSocketStompClient createStompClient() {
WebSocketClient client = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(client);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
return stompClient;
}
stomp 会话处理程序,让您了解它的外观。它应该进入 afterConnected() 方法,但它永远不会进入以下任何方法:
public class CardDetectionStompSessionHandler extends StompSessionHandlerAdapter {
private final ImageClassificationRequest request;
private final String username;
private final String destination = "/card-detection/";
private final WebSocketMessagingService webSocketMessagingService;
private StompSession session;
public CardDetectionStompSessionHandler(
ImageClassificationRequest request,
String username,
WebSocketMessagingService webSocketMessagingService) {
this.request = request;
this.username = username;
this.webSocketMessagingService = webSocketMessagingService;
}
@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
log.info("Client: New session established: {}", session.getSessionId());
this.session = session;
session.subscribe("/user/queue/response", this);
log.info("Client: Subscribed to \"/user/queue/response\"");
session.send("/app" + destination, request);
log.info("Client: Message sent to {}", session.getSessionId());
}
@Override
public Type getPayloadType(StompHeaders headers) {
return ImageClassificationResponse.class;
}
@Override
public void handleFrame(StompHeaders headers, Object payload) {
log.info("Client: Message received");
ImageClassificationResponse response = (ImageClassificationResponse) payload;
webSocketMessagingService.sendToUser(username, response);
if (response.isDone()) {
session.disconnect();
log.info("Client: Disconnected.");
}
}
@Override
public void handleTransportError(StompSession session, Throwable exception) {
log.info("Client: Django is not available");
WebSocketResponse response = new WebSocketResponse();
response.setDisconnect(true);
webSocketMessagingService.sendToUser(username, response);
}
}
我们试图将其更改为 Django 中的异步 websocket,但这并没有改变任何事情。Djangosself.accept
中的connect()
方法似乎没有发送响应或响应 Spring Boot 需要继续。
解决方案
推荐阅读
- arrays - 使用纯 JS 或 Lodash 基于 Array 对集合键进行排序
- oracle - Oracle 12c - 自行编译的软件包
- javascript - 我将如何测试我的登录功能已被调用?角2+
- android - 我的应用程序在执行乘法和除法运算时崩溃
- php - 在嵌入视图中显示模板,并通过 API 在 Docusign 中使用所有选项卡
- c# - 检查服务器c#中的文件是否
- rollup - 有没有办法使用汇总将版权内容放入生成的 js 文件中?
- c# - FCTRL - SPOJ 的阶乘
- php - Symfony 3.4 - Api Rest 修改值
- database - 时间与时间序列数据库