如何使用Flask-Sockets?得到一个KeyError:'wsgi.websocket'

时间:2013-11-20 10:57:06

标签: python sockets websocket flask flask-sockets

我尝试将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')

但是,让我们说我的目标是在一个页面上有一个单词(从列表中随机选择),该单词可以从列表中随机选择的其他值进行更新。你有任何提示吗?

3 个答案:

答案 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运行您的应用程序或自己创建套接字服务器。

我发现这有用https://gist.github.com/lrvick/1185629

答案 2 :(得分:1)

如果使用AWS,我发现有时需要编辑安全组,以便端口80(和443)的类型为&#39;自定义TCP规则&#39;而不是HTTP(和HTTPS)