将套接字服务器和views.py分为两个文件时,如何通过Django视图发送套接字消息?

时间:2019-04-14 08:01:47

标签: django python-3.x sockets

Env:Python 3.6和Django 2.1

我创建了一个Django网站和一个套接字服务器,文件的组织方式如下:

  • 网络
    • ...
    • 用户(Django应用)
      • __init__.py
      • views.py
      • ...
    • server.py

实际上,我想使用django构建一个雨伞出租系统,并且服务器通过多线程套接字(发送一些消息)连接到雨伞架。就像我按下借用按钮一样,views.py可以调用服务器test_function并将一些消息发送到连接的伞架。

我可以在views.py中导入服务器变量或函数,但是在server.py运行时无法获得正确的答案。所以我想问你是否可以给我一些建议。非常感谢!

顺便说一句,我尝试直接在clients中导入全局变量views.py,但仍然得到[]

server.py定义了一个多线程服务器,基本上如下:

clients = []

class StuckThread(threading.Thread):
    def __init__(self, **kwargs):
        self.name = kwargs.get('name', '')

    def run(self):
        while True:
            # do something

    def func1(self):
        # do something


def test_function(thread_name):
    # if the function is called by `views.py`, then `clients = []` and return 'nothing', but if I call this function in `server.py`, then I can get a wanted result, which is `got the thread`
    for client in clients:
        if client['thread'].name == thread_name:
            return 'got the thread'
    return 'nothing'

if __name__ == '__main__':
    ip_port = ('0.0.0.0', 65432)
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(ip_port)
    server.listen(max_listen_num)
    while True:
        client, address = socket.accept()
        param = {'name': 'test name'}
        stuck_thread = StuckThread(**param)
        clients.append({"client": client, "address": address, "thread": stuck_thread})
        stuck_thread.start()

我有一个像这样的Django views.py

def view_function(request):
    from server import clients
    print(clients) # got []
    form server import test_function
    print(test_function('test name')) # got 'nothing'
    return render(request, 'something.html')

1 个答案:

答案 0 :(得分:0)

我已经通过django views.py和server.py之间的套接字通信解决了这个问题。我打开另一个端口以接收来自views.py的消息。按下借用按钮后,views.py中的套接字客户端将建立并将参数和其他消息发送到服务器。