Как отправлять сообщения сокетов через представления Django, когда сервер сокетов и views.py разделены на два файла? - PullRequest
0 голосов
/ 14 апреля 2019

Конверт: 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 голосов
/ 14 апреля 2019

Я решил эту проблему с помощью сокетной связи между django views.py и server.py.Я открываю другой порт для получения сообщений от views.py.Как только кнопка заимствования нажата, клиент сокета в views.py будет создавать и отправлять аргументы и другие сообщения на сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...