简单的服务器端Flask会话变量

Dem*_*ian 1 python security session server-side flask

在Flask中拥有服务器端会话变量的最简单方法是什么?

可变值:

  1. 一个简单的字符串
  2. 对客户端不可见(浏览器)
  3. 没有持久化到数据库-会话消失后消失

有一个内置的Flask会话,但是它将会话数据发送到客户端:

session["secret"] = "I can see you"
Run Code Online (Sandbox Code Playgroud)

数据是base64编码的,并以加密签名的cookie发送,但是在客户端上读取数据仍然微不足道。

在许多框架中,创建服务器端会话变量是一种形式,例如:

session.secret = "You can't see this"
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现的Flask解决方案非常麻烦,并且适合处理大量数据。有没有简单的轻量级解决方案?

lan*_*.io 5

我认为Flask-Session扩展是您想要的。

Flask-Session是Flask的扩展,向您的应用程序添加了对服务器端会话的支持。

从链接的网站:

from flask import Flask, session
from flask_session import Session  # new style
# from flask.ext.session import Session  # old style

app = Flask(__name__)
# Check Configuration section for more details
SESSION_TYPE = 'redis'
app.config.from_object(__name__)
Session(app)

@app.route('/set/')
def set():
    session['key'] = 'value'
    return 'ok'

@app.route('/get/')
def get():
    return session.get('key', 'not set')
Run Code Online (Sandbox Code Playgroud)

  • 这里的示例代码不起作用。似乎Flask-Session发生了变化,更不用说自Flask-Session的代码签入以来已经有两年了。至少将导入更改为“ from flask_session import Session”。但是,仅此还不够。我仍在尝试弄清楚如何使此软件包正常工作。 (2认同)

fcs*_*csr 5

此答案来自 2020 年 6 月,针对flask-session 0.3.2。文档在这里

有几个可用SESSION_TYPES的。在您进行测试时,文件系统是最直接的。如果您打算使用其他SESSION_TYPEs ,则期望您已经拥有 Redis、数据库等设置。关于 SESSION_TYPE 和要求的部分

  • null:NullSessionInterface(默认)
  • Redis : RedisSessionInterface
  • Memcached : MemcachedSessionInterface
  • 文件系统文件系统会话接口
  • MongoDB : MongoDBSessionInterface
  • SQLAlchemy : SqlAlchemySessionInterface

文档中的代码示例。如果你去,/set/然后session['key']用“值”这个词填充。但是如果你先去/get/,那么`session['key'] 将不存在并且它会返回'not set'。

from flask import Flask, session
from flask_session import Session

app = Flask(__name__)

app.config['SESSION_TYPE'] = 'filesystem'
#personal style preference compared to the first answer

Session(app)

@app.route('/set/')
def set():
    session['key'] = 'value'
    return 'ok'

@app.route('/get/')
def get():
    return session.get('key', 'not set')
Run Code Online (Sandbox Code Playgroud)