【问题标题】:Python flask session per user and their own object每个用户和他们自己的对象的 Python 烧瓶会话
【发布时间】:2016-12-22 00:06:52
【问题描述】:

我希望有人能指出实现这种情况的正确方法。

我正在为多个并发用户构建一个烧瓶应用程序。该应用程序本质上包装了一个后端 RESTful 服务,该服务需要身份验证并允许发送命令。用户不需要登录烧瓶应用程序本身,但他们确实提供了我用来向 Restful 服务验证对象的凭据。因此,每个用户都需要他们自己独特的对象用于他们的特定会话。为了便于使用/懒惰,我还将一些琐碎的信息存储在一些 session['x'] 变量中。

会话信息对每个用户来说不是唯一的,它似乎是最后一个“登录”的用户破坏了以前用户的身份验证对象。

构建这个的正确方法是什么?我可以将session 变量移动到对象中,但这仍然存在所有用户都需要自己的后端对象的问题。我需要实现真正的烧瓶登录吗?

【问题讨论】:

  • 你需要展示一些代码。我不确定您如何在请求之间保留身份验证对象 - 您是否将其存储在会话中?您应该做的是根据会话中的唯一数据为每个请求重新创建它。
  • 我将对象作为全局变量保存在应用程序本身中。 (我知道这很糟糕)。我宁愿不重新验证每个请求,因为它在时间上有点昂贵。我无法将对象持久化到session,所以我想这是真正的问题:如何在每个用户会话中持久化对象。
  • 嗯,我不明白你怎么能。存储用户特定内容的唯一位置是在会话或数据库中。但如果这是一个 REST API,他们可能正在使用 OAuth 之类的东西,它应该接受一个令牌,而不是每次都必须重新进行身份验证。
  • @DanielRoseman 谢谢。这意味着我可能需要从对象中重新设计所有内容,并简单地挂在令牌和 URL 上并传递给外部函数。我对此并不热衷,但如果没有可行的答案出现,我会沿着这条路走。

标签: python session flask


【解决方案1】:

我过去曾使用flask-login 扩展来实现登录和会话管理系统。

将用户信息存储在像会话这样的 python 对象中的一个问题是,您将永远无法将应用程序扩展到一个进程之外。在几乎所有情况下,您都希望有多个进程处理请求。每个进程都将使用自己的 python 解释器运行,并且不会共享会话对象。你真的想要一个所有进程共享的数据库来存储会话信息,redis 非常适合这个目的。

对于flask-login,您需要实现一个user class 和两个函数(最好作为用户类的方法实现):

  • 一个登录函数,它将根据您的服务验证提供的用户名和密码,然后使用cryptographically secure pseudo-random number generator(即os.urandom())生成一个大的随机数(16-32 字节)用作会话ID .使用生成的会话 id 作为会话表或数据库中用户会话信息的键,并用作用户类的 id。 login 函数应该返回您的 User 对象。我通常将它实现为 User 类的类方法。

  • 一个 load_user 回调,它将接受在上述函数中生成的会话 ID,并返回代表您的用户的类,该类填充了存储会话信息的数据库中的信息

Flask-login 将处理在用户计算机上安全存储(作为 HMAC)您的会话 ID 作为 cookie 并在请求开始时调用您的 load_user 回调来检索用户的信息。通过从 flask_login (from flask_login import current_user) 导入 current_user 代理,可以获取登录用户的信息。该对象在 jinja 模板中也可用。

【讨论】:

  • 谢谢,我需要几天时间看看能否实现。
  • 酷,如果您有任何问题,请告诉我
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多