2017-08-27 163 views
0

我想構建一個實時Django應用程序。 由於我的託管服務工作的方式,我無法啓動與我的Django服務器並行的Websocket服務器。從Django服務器連接到遠程socket.io服務器

我設法把用戶到用戶交互由Django的服務器上創建一個表達在一個單獨的網站的NodeJS與socket.io服務器,且用戶還連接到遠程服務器socket.io。

但是,我想讓我的Django服務器直接發送事件給用戶。爲此,我想在Django服務器和NodeJS服務器之間建立連接。類似python的東西:

socket = io("http://socket.io.server") 
socket.emit('eventForUsers') 

有沒有辦法讓我達到這個目的?

我發現的唯一信息似乎需要我從我的Django應用程序運行並行服務器,但我無法執行此操作,因爲我的主機不允許我運行長期過程。

回答

1

這真的取決於什麼是最簡單的解決方案,以及您的要求是什麼。 (如果您想進行實時雙向通訊那麼我建議使用,而不是POST例如socket.io客戶端)


POST(GET,PUT,...)

您可以(例如)使用POST請求從你的Django到節點

Django的:python例子(還有其他的方式來執行POST從Django中到節點)

reqParams = {"action":"doThis","data":"put the pizza in the oven"}  
import requests 
requests.post('http://ip:port/route', params = reqParams) 

節點例如:偵聽後在/route(快遞),並打印Django的請求

var express = require('express'); 
var app = express(); 

app.post('/route', function (req, res) { 
    console.log(req.query); res.end(); 
}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!'); 
}); 

然後你可以使用該資料req.params像廣播東西到socket.io客戶執行操作的PARAMS (或特定的客戶端)

這也可以做周圍的其他方式,執行請求從節點發送數據使用到的Django POST (GET,...)


Socket.io-client在Django

另一個(容易)解決方案是包括socket.io-client在你的Django Web應用程序,所以當web應用程序是通過瀏覽器打開它連接到您的節點socket.io服務器作爲客戶端。

(在Django使用javascript)

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io('http://ip:port'); 
    socket.on('connect', function(){alert("Hello World!");}); 
    socket.on('event', function(data){}); 
    socket.on('disconnect', function(){}); 
</script> 

更多資源: 1. JavaScript (Django Docs) 2。Including the static files in your template

+0

不錯,第一個解決方案看起來很聰明我會試試看,並讓你知道。關於第二種解決方案:除非我錯過了一些東西,這隻會將用戶連接到socket.io,而不是django服務器本身?我不明白我如何使用這種方法來進行通信Django - > client –

+0

@RyanPergent我不知道你的確切場景,這就是爲什麼我建議這兩個,所以你可以認爲哪種解決方案最適合你(如果你想要webapp用戶像客戶端連接** socket.io **/else如果你想把webapp本身作爲一個'客戶端'然後使用** request **)。 – EMX

+1

第一種方法工作得很好,唯一的就是'req.query'而不是'req.params' :)。謝謝! –