基本上我想做的是用一组新的密钥重新生成每个会话而无需用户再次登录。我怎么能这样做?
为清晰起见,已修改
因此我们假设我们使用redis作为会话的后端并在客户端保留它的cookie。 Cookie只包含会话ID。此会话ID对应于redis上的会话。在我们通过在我们的应用程序中编写Session(APP)来初始化Session之后,对于每个请求上下文,我们可以通过
获取当前用户的会话from flask import session
在管理员更改了应用程序的一些常规设置后,我愿意重新生成每个当前用户的会话,只能再次为当前用户查看
from flask import session
据我所知。
例如,假设用户会话的值确定为
session['arbitrary_key'] = not_important_database_function()
管理员在应用程序中更改了一些内容后,我需要通过
重新加载当前用户会话的密钥session['arbitrary_key'] = not_important_database_function()
因为在管理员做出更改后,它会产生不同的值。在那之后,我正在改变session.modified
为真。我想要学习的是如何更改每个用户的会话arbitrary_key
。因为我缺乏关于如何获取每个会话并从烧瓶中更改它们的信息。
如果我从redis删除会话,则需要用户重新进行身份验证。我不希望他们重新认证。我只是希望更改后端会话,因为我在用户会话中使用了一些需要从redis获取的信息,因此我不必为每个请求调用not_important_database_function
。
我希望这是足够的信息,你至少不回答,但也不能downvote所以我可以继续为我的问题寻求解决方案。
我不是在分享代码段,因为在我看来,没有代码段对此案有用。
答案 0 :(得分:0)
这个问题已经很老了,但是看起来很多开发人员都对答案感兴趣。我想到了几种方法:
您需要一种区分旧会话值和新会话值的方法。例如,在会话中存储版本号。然后,您可以强制客户端在资源上时更新其会话:
CURRENT_VERSION = '1.2.3'
@app.route('/some_route')
def some_handler():
if session.get('version', '0.0.0') < CURRENT_VERSION:
session['arbitrary_key'] = not_important_database_function()
session['version'] = CURRENT_VERSION
优点:该方法易于实现,并且与存储会话数据(数据库,用户代理等)的方式无关。
缺点::部署后会话数据不会立即更新。您必须放弃某些用户的会话数据可能根本不会更新。
您需要对会话存储进行某种数据库迁移。它是后端依赖的,并且在不同的存储中看起来会有所不同。对于Redis,它可能看起来像这样:
import json
import redis
r = redis.Redis() # Your connection settings here
for key in r.scan_iter():
raw_value = r.get(key)
session = json.loads(raw_value)
session['arbitrary_key'] = not_important_database_function()
r.set(key, json.dumps(session))
优点:所有用户的会话数据将在服务部署后立即更新。
缺点::对于不同的存储,方法的实现也有所不同。如果所有会话数据都存储在用户代理中,则不适用。
尽管在问题中明确指出需要保持用户登录,但它仍然是一个选项。它可能是部署新应用程序版本的策略的一部分:会话密钥在应用程序部署时重新生成,并且所有用户会话无效。
优点::您无需实施任何逻辑来设置新的用户会话值。
缺点::没有新的用户会话值,只是清除了数据。