2013-11-20 64 views
7

我試圖使用Flask-Sockets與示例代碼:如何使用Flask-Sockets?得到一個KeyError異常:「wsgi.websocket」

sockets = Sockets(app) 

@sockets.route('/echo') 
def echo_socket(ws): 
    while True: 
     message = ws.receive() 
     ws.send(message) 

不幸的是,當只是要在URL /回聲使用我的瀏覽器它給了我一個錯誤說:

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而不是內置的dev-server。所以我開始使用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') 

但是,假設我的目標是有其獲取與從列表中隨機選擇其他值更新頁面上的字(從列表中隨機選擇)。你有任何提示,以實現這一目標?

+1

您是否在任何http服務器後運行?你是否已經安裝了libevent,gevent和gevent-websocket? – jbub

+1

@jbub - 我正在運行apache和Flask dev-server。但據我所知,他們沒有相互尊重。我從Flask服務器運行的所有其他內容都沒有問題。另外,我剛剛添加了問題,我只是通過瀏覽器訪問網址,我想這是正確的方法嗎?歡迎任何其他提示,因爲我相當絕望.. – kramer65

+0

注意到其他人遇到這個問題。確保你的端口是正確的。在大多數情況下,端口應該是8000 NOT 5000. –

回答

8

嗯,這個問題,你不能只是定期訪問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這裏:

+0

感謝您的提示!我現在看到警報。我只是好奇;我如何更新某些內容(如單詞),以便用新值替換它?任何提示呢? – kramer65

+0

如果你想開始發送消息,請隨時查看這個例子https://github.com/heroku-examples/python-websockets-chat/blob/master/chat.py,它基於flask-sockets :) – jbub

+0

有沒有辦法做到沒有Gunicorn和只有燒瓶?運行另一個流程似乎很麻煩。 –

2

看來,瓶,接不提供套接字服務器,所以你要麼必須建立nginx代理網絡套接字,使用gunicorn運行你的應用程序或自己創建套接字服務器。

我發現這是很有幫助https://gist.github.com/lrvick/1185629

1

如果使用AWS,我發現有時需要編輯安全組,以便端口80(和443)的類型爲「自定義TCP規則」,而不是HTTP(和HTTPS)

+0

我即將在AWS上部署,所以感謝您的提示! – kramer65