在不注销用户的情况下重新生成所有烧瓶会话

Cap*_*ell 7 python session flask

基本上我想要做的是使用一组新的密钥重新生成每个会话,而无需用户再次登录.我怎样才能做到这一点?

编辑清楚

因此,假设我们使用redis作为会话的后端并在客户端保留它的cookie.Cookie只包含会话ID.此会话ID对应于redis上的会话.在我们通过在我们的应用程序中编写Session(APP)来初始化Session之后,对于每个请求上下文,我们可以通过以下方式获取当前用户的会话

from flask import session 
Run Code Online (Sandbox Code Playgroud)

管理员更改了应用程序的一些常规设置后,我愿意重新生成每个当前用户的会话,只需再次为当前用户查看

from flask import session
Run Code Online (Sandbox Code Playgroud)

这是据我所知.

例如,假设用户会话的值确定为

session['arbitrary_key'] = not_important_database_function()
Run Code Online (Sandbox Code Playgroud)

管理员在应用程序中更改了一些内容后,我需要在当前用户的会话中重新加载密钥

session['arbitrary_key'] = not_important_database_function()
Run Code Online (Sandbox Code Playgroud)

因为在更改管理员之后,它将产生不同的值.在那之后,我正在改变session.modified.我想学的是如何更改arbitrary_key每个用户的开启会话.因为我缺乏有关如何获取每个会话并从烧瓶中更改它们的信息.

如果我从redis删除会话,则需要用户重新进行身份验证.我不希望他们重新认证.我只是希望更改后端会话,因为我在用户会话中使用了一些需要从redis获取的信息,因此我不必not_important_database_function为每个请求调用 .

我希望这是足够的信息,你至少不回答,但也不是downvote所以我可以继续为我的问题寻求解决方案.

我不是在分享代码片段,因为在我看来,没有代码片段对案例有帮助.

Ser*_*bin 0

这个问题相当老了,但看起来许多开发人员对答案感兴趣。我想到了几种方法:

1. 惰性计算

您需要一种方法来区分新旧会话值。例如,在会话中存储版本号。然后,您可以强制客户端在使用您的资源时更新其会话:

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
Run Code Online (Sandbox Code Playgroud)

优点:该方法易于实现,并且与存储会话数据的方式(数据库、用户代理等)无关。

缺点:部署后会话数据不会立即更新。您必须放弃某些用户的会话数据可能根本不会更新。

2. Session存储更新

您需要为会话存储进行某种数据库迁移。它依赖于后端,并且对于不同的存储看起来会有所不同。对于 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))
Run Code Online (Sandbox Code Playgroud)

优点:所有用户的会话数据将在服务部署后立即更新。

缺点:不同存储的方法实现有所不同。如果所有会话数据都存储在用户代理中,则不适用。

3. 删除会话数据

尽管问题中明确指出您需要保持用户登录,但这仍然是一个选项。它可能是部署新应用程序版本的策略的一部分:会话密钥在应用程序部署时重新生成,并且所有用户会话都无效。

优点:您不需要实现任何逻辑来设置新的用户会话值。

缺点:没有新的用户会话值,数据只是被擦除。