我有一个 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 做一些事情并从x11vnc
Seleniums 显示开始。在我添加子流程之前,整个事情都很好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()