flask-socketio在线程完成时发送消息

时间:2016-02-20 20:03:28

标签: python multithreading selenium subprocess flask-socketio

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

zn = zn + 7

@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') 使用Selenium WebDriver执行某些操作,并在Seleniums显示屏上启动do_login。整个过程非常有效,直到我添加了x11vnc子流程:

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> 而不是x11vnc,但我仍然遇到同样的问题。如果我在脚本启动时启动显示和浏览器而不是仅按下登录按钮,整个过程就有效。但我不希望在没有人使用浏览器的情况下启动浏览器,所以这不是一个真正的解决方案......

XvncDisplay

0 个答案:

没有答案