如何在Flask中为会话存储用户数据?

5
我正在创建一个Flask应用程序,需要每个请求都使用用户传递给应用程序以初始化其会话的某些数据。一旦他们传递了该数据并初始化了会话,我希望重复使用该数据,直到他们的会话完成,以填充请求,而无需在每个请求中传递数据。
我似乎找不到最佳方法来实现这一点。将其存储在会话变量中不起作用,因为该数据只是被发送回用户,然后它就像每个请求都传递它一样。将数据存储在数据库中似乎不是正确的选择,因为我需要在会话结束时丢弃它,并且我没有看到任何装饰器来实现会话过期时的操作...所以我担心我的数据库将仅填满来自初始化的所有这些数据,并且没有保证的方法可以在会话结束时删除它们。
有什么建议吗?

也许可以考虑使用 https://pythonhosted.org/Flask-Session/? - Simon Fraser
1个回答

6
你有两个选择:在客户端上存储会话,或者在服务器上存储会话。
要将其存储在服务器上,您需要一个数据存储库。如果您的应用程序需要扩展到任何程度(包括多个uwsgi工作者),则必须使用分布式存储。如果您有redis,那将是最好的选择。请参见Simon Fraser在评论中发布的Flask-Session示例以执行此操作。它将处理将会话对象存储在数据库中,并在需要时获取值。它还处理了大量的后端,因此您拥有的任何数据库都可能可以直接与其配合使用。
如果您不想使用后端会话,则必须使用客户端会话。这可以通过设置cookie来实现- cookie会自动附加到大多数浏览器发送到您的站点的请求上,因此您存储在cookie上的值通常会返回给您。(这就是Facebook如何在您未登录每个页面时记住您的方式。实际上,这就是Flask-Session跟踪要恢复哪个会话的方式!) 为了使其可靠,您必须签名cookie,以便用户无法修改值- Flask可以使用内置的Session处理此操作,或者您可以使用更好的加密库,如Here所述。如果您不希望用户能够看到值,或者如果您有大量数据要存储(cookie的最大大小受限),则必须使用所有这些的服务器端版本。

谢谢回复。我已经使用了带有cookie的会话变量,但问题是每次请求时都会发送20,000字节的大数据块,而不是实际将其存储在会话端并在之后的所有请求中利用它。当我考虑使用mongodb或redis来处理我的会话数据时,我不知道如何在会话结束时清除该会话数据。似乎没有任何装饰器可以运行以进行会话拆卸,以便在不再需要会话数据时可以清除redis/mongodb中的会话数据。 - Roshmaster
你永远不知道会话何时结束 - 你不知道用户在请求之间在浏览器中做了什么。如果对于你的应用程序有意义,你可以在“注销”函数中清空会话。更重要的是,你可以在Redis中为数据设置一个短暂的ETL,让数据库为你处理清理工作。 - Paul Becotte
我明白我不知道会话何时结束。为了解决这个问题,我将会话生命周期设置为5分钟,并且每当用户执行请求时,该时间会得到刷新。因此,实际上,我知道会话将在他们最后一次请求之后的5分钟内结束。我想知道是否有一种方法来处理会话超时时的拆除?当你说ETL时,你是指提取/转换/加载,还是我不知道的其他机制,这些机制特定于这些数据库? - Roshmaster
抱歉,我想说的是TTL,我猜我脑子里想的是ETL。Redis可以让你在一定时间后过期值(使用TTL选项)。我没有使用足够的Mongo来知道它是否提供类似的功能。 - Paul Becotte
应该可以了。我认为我只需要为每个请求刷新TTL,它就会与会话超时的时间同步。感谢您的帮助!能否将这些信息添加到您的第一个答案中,以供其他人参考? - Roshmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接