【问题标题】:Flask: session max size too smallFlask:会话最大大小太小
【发布时间】:2017-10-16 05:16:44
【问题描述】:

我正在构建一个数据分析 Flask 应用程序,它需要大量用户输入,执行一些计算,然后将结果投影到各种网页。我正在使用 pandas Dataframe 来存储输入并执行计算。然后我将 DF 转换为字典并将其存储在会话对象中。

由于会话对象只能容纳约 4k 字节,我遇到了问题。有几个页面读取数据,所以我需要一种方法将大量数据(~5k-50k)从一个请求传递到另一个请求(会话对象可以完美地完成,但内存大小较小)。

我可以为会话对象设置更高的存储限制吗(我想我不能,因为 4k 是 cookie 的限制并且会话对象是 cookie)?还是我应该在这里做其他事情(将字典存储在数据库中等)?

编辑:

我在想一个可行的替代方案是从数据库(在我的例子中是 mongodb)中获取数据,将其存储在本地变量中并将该变量直接传递给模板。这有负面影响吗?我可以将目录传递给模板的内存量是否有限制?请参见下面的示例:

@app.route('/results')
def results():
    # get data I need from database (~5k-50k bytes)
    data = mongo.db[collection_name].find_one({'key': 'query'})
    # pass directory to template (instead of storing in session object)
    return render_template('results_page.html', data=data)

【问题讨论】:

  • 限制与 HTTP cookie 有关。您的选择是:1)存储在数据库中 2)用户使用服务器端缓存系统,如 redis。坚持使用数据库通常不那么令人头疼。对于这种尺寸的东西,无论您选择什么,您都应该能够获得出色的性能。

标签: python session cookies flask


【解决方案1】:

Flask-Session 增加对服务器端会话的支持。

以下是启动 Flask-Session 的方法(摘自official documentation)。

from flask import Flask, session
from flask.ext.session import Session

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

关于渲染模板的大小限制,official Flask documentation 没有提及这一点。 我真的不相信实际上有任何大小限制。

如果有任何限制,那可能是在Jinja's 方面。

【讨论】:

    【解决方案2】:

    是的,这听起来像是服务器端会话的情况。
    最流行的数据库有code snippets on the official site

    这些应该不难迁移,因为它们使用与 cookie 会话系统相同的 SessionMixin 接口。

    更简单的方法是使用Flask-KVSession,它声称

    与 Flask 的集成是无缝的,一旦为 Flask 应用程序加载了扩展,它就会透明地替换 Flask 自己的 Session 管理。任何使用会话的应用程序都应该使用 Flask-KVSession

    【讨论】:

    • 谢谢!我还发现 Flask-Sessions 有助于服务器端会话。我还有一个问题,请参阅上面的编辑。
    • 看起来不错。我的意思是数据在发送到 jinja 模板引擎时不会被复制,只是对同一块内存的引用。那么问题是 - 50kb 对于 HTML 页面来说是否太大了?不,对我来说似乎很好。另一种方法是通过 API 端点提供 json 并让您的页面动态加载它,但这可能不是必需的。
    • 听起来不错。知道 HTML 页面需要多少数据吗?
    • 不完全确定,但我认为这受到服务器内存的限制。在浏览器方面,当您发送超过 4MB 的 JSON 时,似乎会出现延迟 - 请参阅 How big is too big for JSON?
    猜你喜欢
    • 2011-06-06
    • 2021-06-03
    • 1970-01-01
    • 2018-11-05
    • 2013-06-27
    • 2020-09-06
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多