我尝试将Flask-Sockets与示例代码一起使用:
sockets = Sockets(app)
@sockets.route('/echo')
def echo_socket(ws):
while True:
message = ws.receive()
ws.send(message)
不幸的是,当我使用我的浏览器转到url / echo时,它给出了一个错误说:
File "/Library/Python/2.7/site-packages/Flask-0.10-py2.7.egg/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/Library/Python/2.7/site-packages/flask_sockets.py", line 37, in __call__
environment = environ['wsgi.websocket']
KeyError: 'wsgi.websocket'
任何人都有任何想法,我做错了什么?欢迎所有提示!
[编辑]
@jbub - 感谢您的提示!所以首先我现在使用gunicorn而不是内置的开发服务器。所以我用gunicorn -k flask_sockets.worker -b 0.0.0.0:5000 main:app
开始了。然后我将下面的代码插入到views.py中,其中echo_test.html是您提供的代码。当我现在访问/ echo_test时,我确实得到一个提示说" socket closed"。
sockets = Sockets(app)
@sockets.route('/echo')
def echo_socket(ws):
while True:
message = ws.receive()
ws.send(message)
@app.route('/echo_test', methods=['GET'])
def echo_test():
return render_template('echo_test.html')
但是,让我们说我的目标是在一个页面上有一个单词(从列表中随机选择),该单词可以从列表中随机选择的其他值进行更新。你有任何提示吗?
答案 0 :(得分:8)
啊,问题就在于,你不能通过常规的GET请求访问websocket端点,这样wsgi.websocket
就不会被设置为environ。
也使用gunicorn而不是开发服务器,它带有预先配置的worker:
# install from pip
pip install gunicorn
# run app located in test.py module (in test.py directory)
gunicorn -k flask_sockets.worker test:app
我在这里做了快速示例,请务必更新地址和端口以符合您的设置。
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
var ws = new WebSocket("ws://localhost:8000/echo");
ws.onopen = function() {
ws.send("socket open");
};
ws.onclose = function(evt) {
alert("socket closed");
};
</script>
</head>
</html>
这样浏览器就会向服务器发送请求,表明它希望将协议从HTTP切换到WebSocket。
请在此处阅读更多有关websockets的内容:
答案 1 :(得分:2)
似乎Flask-Sockets没有提供套接字服务器,因此您必须设置nginx代理Web套接字,使用gunicorn运行您的应用程序或自己创建套接字服务器。
答案 2 :(得分:1)
如果使用AWS,我发现有时需要编辑安全组,以便端口80(和443)的类型为&#39;自定义TCP规则&#39;而不是HTTP(和HTTPS)