我有一个设置,其中node.js应用程序向基于烧瓶的python服务器发出ajax请求。由于ajax请求缺少cookie数据,因此我无法使用简单的flask会话对象来跨请求保留数据。为了解决这个问题,我想实现会话存储系统的基于redis的服务器端实现,但到目前为止我找到的解决方案都不起作用。
我尝试过的一个解决方案是以下this代码段 但这并不奏效。除了快速入门指南中提到的内容之外,还需要进行更多设置才能配置redis吗?这是我的尝试:
...
from flask import session
# Snippet code is copy pasted here verbatum
import session_interface
...
app = Flask(__name__)
app.session_interface = session_interface.RedisSessionInterface()
...
# Can't access this as session['key'] across requests
session['key'] = value
...
if __name__ == '__main__':
app.secret_key = '123456789012345678901234'
app.run(debug=True)
我尝试过的另一个解决方案是导入Flask-Session extention 但是,我也无法解决这个问题。我对此感到困惑的部分如下:
"我们没有提供类似SESSION_REDIS_HOST和SESSION_REDIS_PORT的内容,如果你想使用RedisSessionInterface,你应该将SESSION_REDIS配置为你自己的redis.Redis实例。这为您提供了更大的灵活性,例如,您可能希望将相同的redis.Redis实例用于缓存目的,然后您不需要在同一进程中保留两个redis.Redis实例。"
本节的含义是什么?我如何理解这一点?我试图让这个扩展工作:
...
from flask import session
from flask_session import Session
import redis
...
app = Flask(__name__)
SESSION_TYPE = 'redis'
app.config.from_object(__name__)
Session(app)
...
# Can't access this as session['key'] across requests
session['key'] = value
...
if __name__ == '__main__':
app.secret_key = '123456789012345678901234'
app.run(debug=True)
是否有人在运行烧瓶的服务器上成功实施了手动会话存储?是否有其他选项可以获得此功能?
感谢您的意见。
答案 0 :(得分:5)
我认为这是因为您错过了存储redis的url配置,要检查一下,您可以使用redis-cli查看是否有任何内容插入到redis中。 对我来说,我使用这个代码,它起作用了:
from flask import Flask
from flask_session import Session
import redis
……
app = Flask(__name__)
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis.from_url('127.0.0.1:6379')
sess = Session()
sess.init_app(app)
def getSession():
return session.get('key', 'not set')
def setSession():
session.set('key')=123
return 'ok'
……
答案 1 :(得分:0)
以下适用于我:
...
from flask_session import Session
import redis
...
app = Flask(__name__)
SECRET_KEY = '123456789012345678901234'
SESSION_TYPE = 'redis'
SESSION_REDIS = redis.from_url('localhost:6379')
app.config.from_object(__name__)
sess = Session()
sess.init_app(app)
...
# Should be available accross requests now
session['key'] = value
...
if __name__ == '__main__':
app.run(debug=True)
使用sess.init_app(app)
代替Session(app)
就可以了。