8

我正在尝试将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 时,我确实收到提示“套接字已关闭”。

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')

但是,假设我的目标是在页面上使用从列表中随机选择的其他值更新一个单词(从列表中随机选择)。您对实现这一目标有什么建议吗?

4

3 回答 3

9

啊,这就是问题所在,你不能只用常规的 GET 请求访问 websocket 端点,那样wsgi.websocket就不会被设置为 environ。

也使用 gunicorn 而不是开发服务器,它带有预配置的工作人员:

# 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 的信息:

于 2013-11-20T19:04:57.117 回答
2

Flask-Sockets 似乎没有提供套接字服务器,因此您必须设置 nginx 来代理 Web 套接字、使用 gunicorn 运行您的应用程序或自己创建套接字服务器。

我发现这很有帮助https://gist.github.com/lrvick/1185629

于 2013-11-21T08:35:04.743 回答
1

如果使用 AWS,我发现有时需要编辑安全组,使端口 80(和 443)属于“自定义 TCP 规则”类型,而不是 HTTP(和 HTTPS)

于 2015-10-13T17:20:44.787 回答