我正在構建一個小型燒瓶&基於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。 那麼,我該如何解決這個錯誤?