1

我有一个 Python 烧瓶脚本(使用flask-socketio),它托管一个带有几个按钮的网站。当我单击其中一个按钮时,浏览器会通过 socket.io 向服务器发送请求。然后服务器在一个新线程中启动一个函数。我想在线程完成后向客户端发送一条消息,但我无法让它工作。

@socketio.on('login', namespace='/command')
def login_account(data):
    data = json.loads(data)
    emit('response', {'command':"login", 'response': 1})
    login = Thread(target=do_login, args=(data["id"],))
    login.start()
    while login.isAlive() == True:
        time.sleep(2)
    emit('response', {"command":"login", 'title':"Melde  " + data["name"].decode('utf-8') + " an", 'response': data["name"].decode('utf-8') + " erfolgreich angemeldet. Verbinde dich per VNC um mit dem Account zu interagieren."}, namespace='/command')

do_login使用 Selenium WebDriver 做一些事情并从x11vncSeleniums 显示开始。在我添加子流程之前,整个事情都很好x11vnc

subprocess.call('x11vnc -display:' + str(display.display) +" 2>/dev/null 1>&2 &", shell=True)

从那时起,我总是在浏览器控制台中得到以下信息:

WebSocket connection to 'ws://somehost:8080/socket.io/?EIO=3&transport=websocket&sid=f1164e481c0f44338b3e952f01830a90' failed: Invalid frame header

在服务器上我得到:

Client disconnected
84.187.79.227 - - [21/Feb/2016 12:14:26] code 400, message Bad request syntax ('\x88\x9a\xc9\x9aVA\xcap\x01$\xab\xc99"\xa2\xff"a\x99\xe895\xa6\xf99-\xe9\xdf$3\xa6\xe8')
84.187.79.227 - - [21/Feb/2016 12:14:26] "??ɚVA?p$??9"??"a??95??9-??$3??" 400 -

我也尝试过使用from eventlet.green import subprocess,但没有帮助。

我的客户代码是:

command = io.connect('http://' + document.domain + ':' + location.port + "/command");
command.on('response', function(data) {
  var data = JSON.parse(JSON.stringify(data))
  if (data["command"] == "login"){
    if (data["response"] == "1"){
      HoldOn.open({
        theme:"sk-folding-cube"
      });
    }
    else{
      HoldOn.close();
      $('#modal_information_title').text(data["title"]);
      $('#modal_information_body').text(data["response"]);
      $('#modal_information').modal('show');
    }
  }
      });

按钮调用:

<button type="button" class="btn btn-primary" onclick="command.emit('login', JSON.stringify({'name':'{{item['username']}}', 'id':'{{item['id']}}'}));">Login</button>

更新

我现在使用XvncDisplay而不是 x11vnc 但我仍然遇到同样的问题。如果我在脚本启动时启动显示和浏览器,而不是仅在按下按钮时登录,那么整个事情都会起作用。但是我不想让浏览器在没有人使用的时候启动,所以这不是一个真正的解决方案......

from pyvirtualdisplay.xvnc import XvncDisplay
display = XvncDisplay(rfbport='5900', size=(800, 700))
display.start()
4

0 回答 0