2017-07-17 84 views
1

我正在创建一个Flask应用程序,要求每个请求都使用用户传递给应用程序初始化其会话的一些数据。一旦他们传递了这些数据并初始化会话,我就想重复使用这些数据,直到他们的会话完成以填充请求,而不必为每个请求传递数据。如何将会话的用户数据存储在Flask中?

我似乎无法找出最好的方法来做到这一点。将其存储在会话变量中不起作用,因为该数据只是被发回给用户,然后就像每次请求传递它一样。将数据存储在数据库中看起来不是正确的选择,因为我需要在会话结束时抛弃它,并且在会话过期时看不到任何装饰器...所以我是担心我的数据库最终会填满所有这些来自初始化的数据,并且没有保证在会话结束时删除它们的方法。

有什么建议吗?

+0

https://pythonhosted.org/Flask-Session/也许? –

回答

1

这里有两个选项:存储在客户端上的会话或存储在服务器上的会话。

要将它存储在服务器上,您需要一个数据存储。如果您的应用程序必须扩展到任何程度(包括多个uwsgi工作者),则必须使用分布式存储。如果你有Redis,那将是最好的选择。查看Simon Fraser在注释中发布的Flask-Session示例来执行此操作。它将处理将会话对象存储在数据库中,并在需要时从中获取值。它也处理大量的后端,因此无论你拥有哪种数据库,都可能会使用它。

如果您不想使用后端会话,则必须使用客户端会话。这是通过设置cookie来完成的 - Cookie自动附加到浏览器发送到您网站的大多数请求,因此您存储在cookie上的值通常会回复给您。 (这就是Facebook如何记住你是谁,没有登录每个页面,事实上,Flask-Session是如何跟踪WHICH会话来恢复的!)。为了使其可靠,您必须签署Cookie,以便用户无法修改值 - Flask可以使用Session中的内置值来处理此问题,也可以使用Here中描述的更好的加密库。如果您不希望用户能够看到这些值,或者您需要存储大量数据(cookie的最大大小是有限的),则必须使用所有这些的服务器端版本。

+0

感谢您的回复。我已经使用会话变量与饼干,但问题是,我最终发送巨大20,000字节的数据为每个请求,而不是实际存储在会话端,并利用它后面的所有请求。 当我想到为会话数据使用mongodb或redis时,我不知道如何在会话结束时清除会话数据。似乎没有任何装饰器可以运行会话拆卸,以便redis/mongodb在不再需要时可以清除会话数据。 – Roshmaster

+0

你永远不知道会话何时结束 - 你不知道用户在浏览器中的请求之间做了什么。如果您的应用有意义,您可以在“注销”功能中清空会话。可能更相关,你可以在redis中的数据上设置一个简短的ETL,并让数据库为你处理清理。 –

+0

对,我知道我不知道会议何时结束。为了解决这个问题,我将会话生存期设置为5分钟,并且每当用户执行请求时都会刷新该时间。所以实际上,我知道会话将在最后一次请求后5分钟结束。我很好奇在会话超时时是否有办法处理拆解? 当你说ETL时,你的意思是提取/转换/加载或其他机制,我不知道这是特定于这些数据库? – Roshmaster