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所以我可以继续为我的问题寻求解决方案.
我不是在分享代码片段,因为在我看来,没有代码片段对案例有帮助.
这个问题相当老了,但看起来许多开发人员对答案感兴趣。我想到了几种方法:
您需要一种方法来区分新旧会话值。例如,在会话中存储版本号。然后,您可以强制客户端在使用您的资源时更新其会话:
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)
优点:该方法易于实现,并且与存储会话数据的方式(数据库、用户代理等)无关。
缺点:部署后会话数据不会立即更新。您必须放弃某些用户的会话数据可能根本不会更新。
您需要为会话存储进行某种数据库迁移。它依赖于后端,并且对于不同的存储看起来会有所不同。对于 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)
优点:所有用户的会话数据将在服务部署后立即更新。
缺点:不同存储的方法实现有所不同。如果所有会话数据都存储在用户代理中,则不适用。
尽管问题中明确指出您需要保持用户登录,但这仍然是一个选项。它可能是部署新应用程序版本的策略的一部分:会话密钥在应用程序部署时重新生成,并且所有用户会话都无效。
优点:您不需要实现任何逻辑来设置新的用户会话值。
缺点:没有新的用户会话值,数据只是被擦除。