如何从NodeJS主动向Django发送JSON数据?
NodeJS主动向Django推送JSON数据的实现方案
Django 端:创建接收JSON的API接口
- 编写视图函数
在你的Django应用的views.py中,添加一个处理POST请求的视图,专门接收NodeJS发来的JSON数据:
import json from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt # 跨域场景必须添加,同域环境可移除(或配置CSRF白名单) def receive_node_data(request): if request.method == 'POST': try: # 解析请求体中的JSON数据 data = json.loads(request.body) # 此处添加业务逻辑:如存入数据库、触发内部流程等 print("收到NodeJS推送的数据:", data) return JsonResponse({"status": "success", "message": "数据接收成功"}, status=200) except json.JSONDecodeError: return JsonResponse({"status": "error", "message": "无效的JSON格式"}, status=400) else: return JsonResponse({"status": "error", "message": "仅支持POST请求"}, status=405)
- 配置URL路由
在应用的urls.py中,将视图映射到指定URL路径:
from django.urls import path from . import views urlpatterns = [ # 其他路由... path('api/receive-node-data/', views.receive_node_data, name='receive_node_data'), ]
- 跨域处理(必选,若两端不同域)
如果NodeJS和Django服务运行在不同域名/端口下,需安装并配置django-cors-headers允许跨域请求:
- 安装依赖:
pip install django-cors-headers - 在
settings.py中添加配置:
INSTALLED_APPS = [ # 其他应用... 'corsheaders', ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', # 需放在中间件列表最前方 'django.middleware.common.CommonMiddleware', # 其他中间件... ] # 生产环境建议指定具体域名,而非允许所有 CORS_ALLOW_ALL_ORIGINS = True
NodeJS 端:主动发送JSON数据到Django
- 选择HTTP客户端
推荐使用易用的第三方库axios,先安装:
npm install axios
- 封装发送函数
编写发送逻辑,在数据生成后立即调用该函数推送至Django:
const axios = require('axios'); // 替换为你的Django服务实际地址 const DJANGO_API_URL = 'http://your-django-domain:port/api/receive-node-data/'; async function sendToDjango(jsonData) { try { const response = await axios.post(DJANGO_API_URL, jsonData, { headers: { 'Content-Type': 'application/json', // 若需身份验证,在此添加凭证,如: // 'Authorization': 'Bearer YOUR_AUTH_TOKEN' } }); console.log('数据发送成功,Django返回:', response.data); } catch (error) { console.error('发送数据失败:', error.response?.data || error.message); // 可选:添加重试逻辑,避免网络波动导致数据丢失 // setTimeout(() => sendToDjango(jsonData), 5000); } } // 模拟数据生成场景:此处替换为你的实际数据生成逻辑 function generateData() { const newData = { id: Date.now(), content: 'NodeJS生成的业务数据', timestamp: new Date().toISOString() }; // 数据生成后立即推送 sendToDjango(newData); } // 测试:每5秒生成并推送一次数据 setInterval(generateData, 5000);
如果不想依赖第三方库,可使用NodeJS内置http模块实现:
const http = require('http'); function sendToDjango(jsonData) { const data = JSON.stringify(jsonData); const options = { hostname: 'your-django-domain', port: 'port', path: '/api/receive-node-data/', method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(data) } }; const req = http.request(options, (res) => { let responseData = ''; res.on('data', (chunk) => responseData += chunk); res.on('end', () => console.log('Django返回:', JSON.parse(responseData))); }); req.on('error', (error) => console.error('发送失败:', error.message)); req.write(data); req.end(); }
额外注意事项
- 身份验证:若Django接口需要权限,可使用TokenAuthentication或SessionAuthentication,NodeJS在请求头中携带对应凭证即可。
- 可靠性保障:对关键业务数据,可引入消息队列(如Redis、RabbitMQ),NodeJS先将数据存入队列,再异步推送至Django,避免网络故障导致数据丢失。
- 日志监控:在两端添加详细日志,便于排查发送/接收过程中的异常问题。
内容的提问来源于stack exchange,提问作者Alireza
相关产品推荐
相关产品推荐

