当socket server和views.py分成两个文件时,如何通过Django视图发送套接字消息?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当socket server和views.py分成两个文件时,如何通过Django视图发送套接字消息?相关的知识,希望对你有一定的参考价值。

环境: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')
答案

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

以上是关于当socket server和views.py分成两个文件时,如何通过Django视图发送套接字消息?的主要内容,如果未能解决你的问题,请参考以下文章

当我们可以通过在urls.py中的views.py和urls中添加视图时,是否需要在ModelAdmin类的管理页面中添加自定义视图?

当 Django views.py 没有将字典值传递给 html 时如何解决?

如何使用 jQuery/AJAX 访问 views.py 中的变量?

从 django views.py 获取数据并使用 ajax 显示它

如何在views.py中制作频道客户端?

二 Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器