You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在独立Django项目中获取Socket.io的Payload数据并打印?

如何将Socket.io广播的Payload数据传递到Django并打印

Socket.io基于WebSocket实现双向实时通信,和HTTP属于不同协议,因此直接用HttpResponse无法获取Socket.io广播的数据。以下是两种可行的实现方案:

方案一:在Django中集成Socket.io客户端直接监听

通过Python的Socket.io客户端库连接到你的JS Socket.io服务端,实时接收广播数据并打印。

  1. 安装依赖库
pip install python-socketio[client]
  1. 创建Django自定义命令用于监听
    在你的Django应用下创建management/commands目录,新增socket_listener.py文件:
# myapp/management/commands/socket_listener.py
import socketio
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = '监听Socket.io服务端的污染物数据广播'

    def handle(self, *args, **options):
        # 初始化Socket.io客户端
        sio = socketio.Client()

        # 绑定JS服务端广播的事件名(替换为你实际使用的事件名)
        @sio.on('pollutant_update')
        def handle_data(data):
            self.stdout.write(self.style.SUCCESS(f'收到污染物数据:{data}'))
            # 可选:将数据存入Django数据库或进行其他处理

        # 连接到JS服务端(确保地址和端口正确)
        sio.connect('http://localhost:3000')
        # 保持连接监听
        sio.wait()
  1. 启动监听命令
python manage.py socket_listener

方案二:JS服务端将数据通过HTTP POST转发到Django

在JS项目广播Socket.io数据的同时,将数据以HTTP POST请求发送到Django的API接口,实现数据中转。

  1. 在Django中创建接收数据的视图和路由
# myapp/views.py
from django.http import JsonResponse
import json

def receive_pollutant_data(request):
    if request.method == 'POST':
        try:
            # 解析POST请求中的JSON数据
            data = json.loads(request.body)
            print(f'从Socket.io服务端收到污染物数据:{data}')
            return JsonResponse({'status': 'success'}, status=200)
        except Exception as e:
            return JsonResponse({'status': 'error', 'msg': str(e)}, status=400)
    return JsonResponse({'status': 'method_not_allowed'}, status=405)

配置路由:

# project/urls.py
from django.urls import path
from myapp.views import receive_pollutant_data

urlpatterns = [
    # 其他路由...
    path('api/receive-pollutant/', receive_pollutant_data, name='receive_pollutant'),
]
  1. 修改JS项目添加HTTP转发逻辑
    在你的JS项目中,广播Socket.io数据后新增POST请求代码:
// 生成模拟污染物数据
const pollutantData = {
    type: 'PM2.5',
    value: 35,
    timestamp: new Date().toISOString()
};

// 广播到Socket.io客户端
io.emit('pollutant_update', pollutantData);

// 转发到Django接口(替换为你的Django服务地址)
fetch('http://localhost:8000/api/receive-pollutant/', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify(pollutantData),
})
.then(res => res.json())
.catch(err => console.log('转发数据到Django失败:', err));

方案对比

  • 方案一:实时性强,直接建立WebSocket连接,适合需要持续监听数据的场景,但需要Django进程保持长连接。
  • 方案二:实现简单,无需维护长连接,适合数据转发频率不高的场景,但实时性略逊于方案一。

内容的提问来源于stack exchange,提问作者Cason Mercadejas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:09:26