2014-07-04 40 views
0

我正在構建一個小型燒瓶&基於pyhon的應用程序,我的主要功能是基於websockets。我發現我無法修改websockets事件的事件處理程序中的sesssion的值(我使用flask-socketio),因爲flask將其會話存儲在客戶端。所以,作爲擴展名recomanded的作者,我安裝了flask-kvsession來將該會話存儲在基於redis的後端的服務器端。無法修改事件處理程序中的websockets事件會話的值

我按照提示http://pythonhosted.org/Flask-KVSession/,但問題依然存在。所以我創建了一個小程序來向你展示我在說什麼。

# main.py 
from flask import Flask, session, render_template 
from flask.ext.socketio import SocketIO 
from pprint import pprint 
import redis 
from flask_kvsession import KVSessionExtension 
from simplekv.memory.redisstore import RedisStore 

store = RedisStore(redis.StrictRedis()) 

app = Flask(__name__) 
app.debug = True 
app.secret_key = 'secret!' 
KVSessionExtension(store, app) 
socketio = SocketIO(app) 

@app.route('/') 
def index(): 
    pprint(session) 
    return render_template("client.html") 

@socketio.on('connect') 
def handle_connect(message): 
    session['debug'] = 'debug' 

    pprint(session) 

if __name__ == "__main__": 
    socketio.run(app) 


<!-- templates/client.html --> 
<!DOCTYPE html> 
<html> 
    <head> 
    </head> 

    <body> 
     <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/ 
      socket.io/0.9.16/socket.io.min.js"></script> 
     <script type="text/javascript"> 
      var sock = io.connect('http:localhost:5000'); 
      sock.emit('connect', {debug: 'debug'}); 
     </script> 

    </body> 

</html> 

這裏是WERKZEUG調試運行服務器的輸出:

* Running on http://127.0.0.1:5000/ 
* Restarting with reloader 
<KVSession {}> 
127.0.0.1 - - [2014-07-04 21:25:51] "GET/HTTP/1.1" 200 442 0.004452 
<KVSession {'debug': 'debug'}> 
<KVSession {}> 
127.0.0.1 - - [2014-07-04 21:26:02] "GET/HTTP/1.1" 200 442 0.000923 
<KVSession {'debug': 'debug'}> 

我想到的是,第二遍的時候,我會訪問該網頁的會話內容是'debug': 'debug'但它不是。

這裏是Redis的服務器上發生的事情,而我是運行這個程序:

127.0.0.1:6379> MONITOR 
OK 
1404498351.888321 [0 127.0.0.1:38129] "GET" "136931c509f674e3_53b6e25b" 
1404498352.073011 [0 127.0.0.1:38129] "GET" "136931c509f674e3_53b6e25b" 
1404498362.455320 [0 127.0.0.1:38129] "GET" "136931c509f674e3_53b6e25b" 
1404498362.612346 [0 127.0.0.1:38129] "GET" "136931c509f674e3_53b6e25b" 

正如你所看到的,會議的價值被訪問4次,但從未modfied。 那麼,我該如何解決這個錯誤?

回答

1

如文檔中所述,Flask-SocketIO不會將會話寫回到會話存儲區,它只是將它們保存在內存中並可供套接字處理程序訪問。

如果要更改服務器端會話以保持常規HTTP客戶端的可用狀態,則必須在進行這些更改後自行保存會話。我沒有這個測試自己,但我認爲這會做:

session.modified = True 
app.save_session(session, make_response('dummy')) 

注意save_session()得到一個虛擬迴應。如果在此之前已經在常規的HTTP調用中建立會話,這將僅適用。很明顯,上面的代碼不會創建新的會話,因爲響應將被丟棄並且永遠不會到達客戶端。

相關問題