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

Simple server-side Flask session variable

提问人:Dem Pilafian 提问时间:4/9/2017 最后编辑:Peter MortensenDem Pilafian 更新时间:12/31/2020 访问量:16342

问:

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

变量值:

  1. 一个简单的字符串
  2. 对客户端(浏览器)不可见
  3. 未保存到数据库 -- 在会话消失时消失

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

session["secret"] = "I can see you"

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

在许多框架中,创建服务器端会话变量是单行的,例如:

session.secret = "You can't see this"

到目前为止,我发现的 Flask 解决方案非常繁琐,并且适用于处理大量数据。有没有一个简单的轻量级解决方案?

Python 安全 会话 Flask 服务器端

评论

2赞 pvg 4/9/2017
flask.pocoo.org/snippets/132,除了跳过保存到磁盘。
0赞 TheGreatContini 4/10/2017
请澄清您在向客户发送数据时遇到的问题。几乎每个框架都使用 cookie 来获取会话标识符/令牌。然后,会话标识符可用于查找存储在本地数据库中的其他会话数据。这是你想做的吗?
0赞 Dem Pilafian 11/24/2017
@TheGreatContini谷歌的“服务器端会话变量”,有成千上万的相关结果。只要应用程序服务器存在,会话变量就一直存在。根据下面的答案,Flask 有一个插件来支持会话变量。并非所有瞬态数据都需要存储在本地数据库中。

答:

10赞 langlauf.io 11/24/2017 #1

我认为 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')

评论

5赞 Jason 2/18/2019
此处的示例代码不起作用。似乎 Flask-Session 发生了变化,更不用说自从 Flask-Session 的代码签入以来已经有 2 年了。至少将 import 更改为 .但仅凭这一点是不够的。我仍在尝试弄清楚如何让这个包工作。from flask_session import Session
0赞 Akash senta 5/29/2020
为任何人工作吗?我试图实现相同的方法,但没有奏效。任何人都可以分享工作示例。谢谢
0赞 Nirav Mistry 3/25/2023
是的,执行 “pip install Flask-Session” 来安装flask_session包
7赞 fcsr 6/25/2020 #2

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

有几个可用的文件系统是测试时最直接的。如果您要使用其他 s. SESSION_TYPE和要求部分,则期望您已经拥有 Redis、数据库等设置SESSION_TYPESSESSION_TYPE

  • null:NullSessionInterface(默认值)
  • Redis:RedisSessionInterface
  • Memcached:MemcachedSessionInterface
  • 文件系统:FileSystemSessionInterface
  • MongoDB的:MongoDBSessionInterface
  • SQLAlchemy:SqlAlchemySessionInterface

文档中的代码示例。如果转到,则填充了“值”一词。但是如果你先去,那么'session['key']将不存在,它将返回'not set'。/set/session['key']/get/

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')

评论

0赞 Ilan Yashuk 6/10/2022
可以肯定的是,var 的设置方式是唯一正确的方式,正如 Martijn Pieters 指出的那样:“对于 Flask 0.10 或更高版本来说,这没有多大意义;NullSession 在 Flask 0.8 或 0.9 中可能很有意义,但在当前版本中,flask.session.NullSession 类被用作错误信号。在你的情况下,它现在给你错误的错误消息。SESSION_TYPE