带有 Spring Boot Websockets (StompSession) 的 Django 通道不起作用

Cpt*_*mer 11 django stomp websocket spring-boot django-channels

嘿,我们想使用 Django 来执行 python 代码并使用通道来获取结果。实现了 websockets 无法正常工作的所有内容。如果我尝试从我们的 Angular 前端向 Django 发送一些东西,它工作正常。否则我们的 Spring Boot StompSession Websockets 可以与其他 Spring Boot 应用程序和 Angular 一起正常工作。

但是 Django 3.1.3 和 Spring Boot 2.3.3 没有。此外,使用通道 3.0.2、通道-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
Run Code Online (Sandbox Code Playgroud)

一旦 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
Run Code Online (Sandbox Code Playgroud)

我们从 Spring Boot 发送一个 base64 编码的图像。但其他一切都不起作用。正如你所看到的text_data仅仅是CONNECT.

弹簧靴:

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
Run Code Online (Sandbox Code Playgroud)

stomp 会话处理程序让您了解它的外观。它应该进入 afterConnected() 方法,但它永远不会进入任何以下方法:

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
Run Code Online (Sandbox Code Playgroud)

我们尝试将其更改为 Django 中的异步 websocket,但这并没有改变任何事情。该self.accept在Django的connect()方法似乎并不发送响应或春季启动需要去回应。