【问题标题】:Simple server-side Flask session variable简单的服务器端 Flask 会话变量
【发布时间】:2020-12-31 01:14:31
【问题描述】:

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

变量值:

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

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

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

数据经过 Base64 编码并在加密签名的 cookie 中发送,但在客户端上读取仍然很简单。

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

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

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

【问题讨论】:

  • flask.pocoo.org/snippets/132 除了跳过保存到磁盘。
  • 请澄清您向客户端发送数据的问题。几乎每个框架都使用 cookie 来获得会话标识符/令牌。然后可以使用会话标识符来查找存储在本地数据库中的其他会话数据。这是你想做的吗?
  • @TheGreatContini Google "服务器端会话变量" 有成千上万的相关结果。只要 appservers 存在,会话变量就已经存在。根据下面的答案,Flask 有一个支持会话变量的插件。并非所有瞬态数据都需要存储在本地数据库中。

标签: python security session flask server-side


【解决方案1】:

我认为Flask-Session 扩展是您正在寻找的。​​p>

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

来自链接的网站:

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

【讨论】:

  • 这里的示例代码不起作用。似乎 Flask-Session 发生了变化,更不用说 Flask-Session 的代码签入已经有 2 年了。至少将导入更改为from flask_session import Session。但仅此还不够。我仍在试图弄清楚如何让这个包工作。
  • 对任何人都有效吗?我试图实现相同但没有奏效。任何人都可以分享工作示例。谢谢
【解决方案2】:

此答案来自 2020 年 6 月,用于烧瓶会话 0.3.2。 文档是here

有几个可用的SESSION_TYPESs。 filesystem 在您进行测试时是最直接的。如果您打算使用其他 SESSION_TYPEs,则期望您已经拥有 Redis、数据库等设置。 Section on SESSION_TYPE and requirements

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-04
    • 2015-10-02
    • 2019-04-05
    • 2017-05-07
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多