【问题标题】:Flask-Session extension vs default sessionFlask-Session 扩展与默认会话
【发布时间】:2015-08-19 00:26:46
【问题描述】:

我正在使用:

from flask import session

@app.route('/')
def main_page():
    if session.get('key'):
        print ("session exist" + session.get('key'))
    else:
        print ("could not find session")
        session['key'] = '34544646###########'
    return render_template('index.html')

我没有安装 Flask-Session 扩展,但这仍然可以正常工作。我试图了解为什么以及何时该扩展对我来说很重要。据我所知,默认会话对我来说效果很好。

【问题讨论】:

  • 好问题 - 即使我也有类似的问题.. #following

标签: python flask


【解决方案1】:

区别在于会话数据的存储位置。

Flask 的会话是客户端 会话。您写入会话的任何数据都会写入 cookie 并发送到客户端进行存储。客户端将在每次请求时将 cookie 发送回服务器,这就是您在会话中写入的数据在后续请求中保持可用的方式。存储在 cookie 中的数据经过加密签名,以防止任何篡改。配置中的 SECRET_KEY 设置用于生成签名,因此只要您的密钥保持私密,客户端会话中的数据就是安全的。请注意,此上下文中的 secure 意味着会话中的数据不能被潜在的攻击者修改。任何知道如何查看的人仍然可以看到这些数据,因此您永远不应该在客户端会话中写入敏感信息。

Flask-Session 和 Flask-KVSession 是 Fl​​ask 的两个扩展,用于实现 服务器端 会话。从应用程序的角度来看,这些会话的工作方式与 Flask 本机会话完全相同,但它们将数据存储在服务器中。数据永远不会发送到客户端,因此安全性有所提高。客户端仍然会收到一个签名的 cookie,但 cookie 中唯一的数据是一个 会话 ID,它引用了存储数据的服务器中的文件或数据库索引。

【讨论】:

  • 感谢您的澄清。我希望他们能在文档中更好地解释这一点。
  • 使用服务器端会话的唯一原因是在会话中存储敏感数据时吗?
  • 我们可以创建实现我们自己的SessionInterface 并将会话存储在服务器上。例如,reddis store。这和使用 flask-session 有什么区别?
  • @MatthewMoisen 如果您查看 Flask-Session 的文档,您会发现 redis 实际上是他们提供的关于在哪里存储数据服务器端的选项之一。
  • 在服务器上存储会话的一大优势是能够存储对象而无需将它们转换为 dicts/json。例如,我可以使用 flask_session 模块将数据帧存储在会话文件中,而使用本机 flask.session,数据必须是字典。
【解决方案2】:
from flask import session

所有会话数据的 Cookie 都存储在客户端。

优点: 验证和创建会话很快(无数据存储) 易于扩展(无需跨网络服务器复制会话数据)

缺点: 敏感数据不能存储在会话数据中,因为它存储在 Web 浏览器中 会话数据受 cookie 大小限制(通常为 4 KB) Flask 应用程序不能立即撤销会话

from flask_session import Session

会话数据存储在服务器端。

优点: 敏感数据存储在服务器上,而不是 Web 浏览器中 您可以根据需要存储尽可能多的会话数据,而不必担心 cookie 的大小 Flask 应用程序可以轻松终止会话

缺点: 难以设置和扩展 由于必须管理会话状态,因此增加了复杂性

*此信息来自帕特里克·肯尼迪 (Patrick Kennedy) 的出色教程:https://testdriven.io/blog/flask-server-side-sessions/

【讨论】:

    【解决方案3】:

    会话

    会话可以记住从一个请求到另一个请求的信息。 Flask 这样做的方式是使用 签名的 cookie。 Cookie 可以被修改,除非他们有 SECRET KEY。保存在 Client Side 中,除非 permanent 设置为 TRUE(布尔值)。如果 Permanent 设置为 True,它会在服务器默认存储 31 天,除非它在烧瓶应用程序中提到 PERMANENT_SESSION_LIFETIME

    Flask 会话:

    Flask-Session 是 Fl​​ask 的一个扩展,它为您的应用程序添加了对服务器端会话的支持。将会话存储在服务器端是主要目标

    Server Side method are
     - redis: RedisSessionInterface
     - memcached: MemcachedSessionInterface
     - filesystem: FileSystemSessionInterface 
     - mongodb: MongoDBSessionInterface
     - sqlalchemy: SqlAlchemySessionInterface
    

    Flask-Session 是 Session 的扩展。 基于配置方法,覆盖现有的会话保存方法。

    flask.sessions.SessionInterface: SessionInterface 是您必须实现的基本接口,以便替换使用 flask(werkzeug's) 安全 cookie 实现的默认会话接口。 您必须实现的唯一方法是 open_session() 和 save_session(),其他方法具有有用的默认值,您无需更改。 基于此,他们正在更新所选存储中的会话 Session Interface

    参考链接:

    `

    【讨论】:

    • 如果你觉得内容丰富,请点赞,谢谢
    猜你喜欢
    • 2014-11-22
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多