gpt4 book ai didi

python - 无法在 websockets 事件的事件处理程序中修改 session 的值

转载 作者:可可西里 更新时间:2023-11-01 11:21:55 24 4
gpt4 key购买 nike

我正在构建一个基于 flask 和 pyhon 的小应用程序,我的主要功能是基于 websockets。我发现我无法在 websockets 事件的事件处理程序中修改 session 的值(我正在使用 flask-socketio),因为 flask 将其 session 存储在客户端。因此,根据扩展作者的建议,我安装了 flask-kvsession 以将 session 存储在服务器端的基于 redis 的后端中。

我遵循了提供的说明 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'}>

我希望第二次访问该页面时 session 的内容是 '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"

如您所见, session 的值被访问了 4 次,但从未被修改。那么,我应该怎么做才能修复这个错误?

最佳答案

如文档中所述,Flask-SocketIO 不会将 session 写回 session 存储,它只是将它们保存在内存中并可供套接字处理程序访问。

如果您希望对服务器端 session 的更改持续存在并可供常规 HTTP 客户端使用,您必须在进行这些更改后自行保存 session 。我自己还没有测试过,但我认为这样做可以:

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

请注意,save_session() 得到一个虚拟响应。只有在此之前已经在常规 HTTP 调用中建立了 session ,这才会起作用。显然,不会使用上面的代码创建新 session ,因为响应将被丢弃并且永远不会到达客户端。

关于python - 无法在 websockets 事件的事件处理程序中修改 session 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24579379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com