用于基于套接字的连接的Django频道或龙卷风

时间:2017-05-30 10:28:37

标签: python django websocket django-channels

我正在开展一个项目,我有一个可通过Django Rest API查看的加油站列表,显示车站数据,即燃料和容量的可用性。

我还开发了一种微控制器来检测燃油油位。现在问题是这个数据将每10分钟发送到我的网络后端(将来可以减少到1分钟),通过其余的api更新站点模型。我不知道如何处理这个问题。在这种情况下,Django频道会有用吗?

服务器使用C和Java的混合来发送数据。我需要它是一个可扩展的解决方案,因为有可能创建许多站点。

1 个答案:

答案 0 :(得分:1)

我会回答我自己的问题。 Websockets允许双向通信机制,无论是在客户端浏览器和Web服务器之间,还是服务器到服务器之间的通信。

有许多关于如何在客户端浏览器和Web服务器之间建立此连接的教程,但有关如何在两个服务器之间进行交互的文档非常有限。

如果设置了Django频道并收听传入连接,即在127.0.0.1:8001

因此,您的consumers.py会有一个代码,例如ws_message,其中包含您传输任何传入消息的路由。它只会回显它收到的终端。

from channels import Group
def ws_message(message):
    print(message.content['text'])
    Group('chat').send({
        'text': 'user %s' % message.content['text'],
    })

然后,如果要从其他服务器(可能是传输数据的微控制器)建立连接,以下代码将数据发送到指定的地址127.0.0.1:8001。 请注意,您确实需要用于python的websocket包

pip install websocket

server-socket.py

import websocket
import _thread as thread
import time

def on_message(ws, message):
    print(message)

def on_error(ws, error):
    print(error)

def on_close(ws):
    print('Closed Connection')

def on_open(ws):
    def run(*args):
        for i in range(100):
            time.sleep(1)
            ws.send("%d" % i)
        time.sleep(1)
        ws.close()
        print ("thread terminating...")
    thread.start_new_thread(run, ())


if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("ws://127.0.0.1:8001",
                                 on_message = on_message,
                                 on_error = on_error,
                                 on_close = on_close)
    ws.on_open = on_open
    ws.run_forever()

这很简单。它将0-99范围内的数字发送到连接的websocket。