我有一个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