如何为 Flask 应用程序用户分配 Redis 键名?

How to assign Redis key names to Flask app users?

我有一个 Flask 应用程序,它在本地主机上的 Redis 中存储用户会话。
用户会话由 Flask-Session 模块管理:

import flask
import redis  
import flask_session

app = flask.Flask(__name__)

app.secret_key = b'Test123'

app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_KEY_PREFIX'] = 'flask_session_'
app.config['SESSION_PERMANENT'] = False
app.config['SESSION_USE_SIGNER'] = True
app.config['SESSION_REDIS'] = redis.from_url('redis://localhost:6379', password='Test123')

server_session = flask_session.Session(app)

我想知道哪个 Redis 会话密钥 name 属于哪个用户或设备。
例如,我想将客户端的 IP 地址添加到 Redis 键名中。
可能吗?
当我尝试获取客户端的 IP 地址并将其设置为这样的键前缀时:

ip = flask.request.environ.get('REMOTE_ADDR')

app.config['SESSION_KEY_PREFIX'] = 'flask_session_' + ip

我在 Apache 中收到此消息 error.log:

RuntimeError: Working outside of request context.
[Fri Feb 11 22:19:14.371919 2022] [wsgi:error] [pid 264638:tid 264787] [remote 1.2.3.4:35695] This typically means that you attempted to use functionality that needed
[Fri Feb 11 22:19:14.371930 2022] [wsgi:error] [pid 264638:tid 264787] [remote 1.2.3.4:35695] an active HTTP request. Consult the documentation on testing for
[Fri Feb 11 22:19:14.371941 2022] [wsgi:error] [pid 264638:tid 264787] [remote 1.2.3.4:35695] information about how to avoid this problem.

我想通了。
显然你不能在请求之前 运行 flask.request.environ.get('REMOTE_ADDR') ,即使 @app.before_request.
因此,为了识别会话(Redis 密钥名称)并将它们分配给应用程序用户(所以我知道哪个 session/key 属于哪个用户)我的应用程序现在将 Flask-Session SID 连同登录的用户名一起写入 Apache error.log:

app.logger.warning('User ' + login + ' logged in. Flask-Session SID: ' + str(flask.session.sid) + '. Flask-Login session ID: ' + str(flask.session['_id']) + '.')

Flask-Session SID 为 Redis 键名。
另一种方法是在请求后(用户登录后)将用户名或 IP 地址存储在 flask.session 中,SCAN-ning Redis KEYS 用于值(用户名或 IP 地址)和 RENAME-按模式输入键。