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

All*_*ore 1 python ajax session redis flask

我有一个设置,其中node.js应用程序正在向基于烧瓶的python服务器发出ajax请求.由于ajax请求缺少cookie数据,因此我无法使用简单的flask会话对象来跨请求保留数据.为了解决这个问题,我想实现一个基于redis的会话存储系统服务器端实现,但到目前为止我找到的解决方案都不起作用.

我尝试过的一个解决方案是以下这个代码片段.
但这不起作用.除了快速入门指南中提到的内容之外,还需要进行更多设置来配置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)
Run Code Online (Sandbox Code Playgroud)

我尝试过的另一个解决方案是导入Flask-Session 扩展.
但是,我也无法让这个工作.我困惑的部分如下:

"我们没有提供像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)
Run Code Online (Sandbox Code Playgroud)

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

感谢您的输入.

Fio*_*ona 8

我想那是因为你错过了存储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'
……
Run Code Online (Sandbox Code Playgroud)


F. *_*ago 5

以下对我有用:

...
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)
Run Code Online (Sandbox Code Playgroud)

使用sess.init_app(app)而不是Session(app)达到了目的。