使用redis和flask实现服务器端会话存储很困难

时间:2017-06-26 21:45:03

标签: python ajax session flask redis

我有一个设置,其中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)

是否有人在运行烧瓶的服务器上成功实施了手动会话存储?是否有其他选项可以获得此功能?

感谢您的意见。

2 个答案:

答案 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)就可以了。