【问题标题】:set time to live for each session separately KVsession flask分别为每个会话设置生存时间 KVsession 烧瓶
【发布时间】:2018-11-05 15:27:35
【问题描述】:

KBsession 根据 PERMANENT_SESSION_LIFETIME 存储会话 TTL 是否有办法为特定会话覆盖此设置

编辑: 所以我有两个不同的登录 API 我需要从其中一个给任何用户登录一个无限会话 TTL,另一个将采用 PERMANENT_SESSION_LIFETIME 值 注意:KBsession后端是redis

【问题讨论】:

  • 您能详细解释一下吗?你想为特定用户或组更改PERMANENT_SESSION_LIFETIME 吗?
  • 它实际上是针对特定用户的,所以我必须登录 API 任何来自特定 API 的用户登录都应该有无限的会话 TTL,来自另一个的任何人都应该有一个常规会话
  • 您是使用不同的端点登录(针对特定用户类型)还是只使用一个端点?
  • 不同的端点

标签: flask flask-kvsession


【解决方案1】:

我认为最好的方法是使用Session Interface 来创建特定的处理。这只是一个例子,但我希望你能理解方法。

from flask import Flask, session as flask_session, jsonify

flask_app = Flask(__name__)
# just a few user types
UNIQUE_USER_TYPE = 'unique'
DEFAULT_USER_TYPE = 'default'

@flask_app.route('/login-default')
def login_default():
    flask_session['user_type'] = DEFAULT_USER_TYPE
    return 'login default done'

@flask_app.route('/login-unique')
def login_unique():
    flask_session['user_type'] = UNIQUE_USER_TYPE
    return 'login unique done'

@flask_app.route('/session-state')
def get_session_state():
    return jsonify(dict(flask_session))


class UserTypeSessionInterface(SecureCookieSessionInterface):

    def get_expiration_time(self, app, session):
        """
        I just override method. Just demonstration.
        It's called from save_session() and open_session()
        """
        if session.get('user_type') == UNIQUE_USER_TYPE:
            # set 1 hour for unique users
            delta = datetime.utcnow() + timedelta(hours=1)
        else:
            # set 3 hour for default users
            delta = datetime.utcnow() + timedelta(hours=3)
        # add datetime data into session
        session['lifetime'] = delta.strftime('%Y-%m-%dT%H:%M:%S')
        return delta
# use our custom session implementation
flask_app.session_interface = UserTypeSessionInterface()

现在运行服务器,打开新的私人窗口,/login-default/session-state

# default behaviour
{
  "lifetime": "2018-11-06T16:22:21", 
  "user_type": "default"
}

再打开一个私密窗口,/login-unique/session-state

# unique behaviour
{
   "lifetime": "2018-11-06T14:25:17", 
   "user_type": "unique"
}

所以,会话存储工具无关紧要(redis、cassandra 或其他)。您所需要的只是实现open_session()save_session()

class YourSessionProcessor(SessionInterface):

    def open_session(self, app, request):
        # just do here all what you need
        pass

    def save_session(self, app, session, response):
        # just do here all what you need
        pass

flask_app.session_interface = YourSessionProcessor()

你也可以使用自定义会话类(只是一个例子):

from flask.sessions import SessionMixin
from werkzeug.datastructures import CallbackDict

class CustomSession(CallbackDict, SessionMixin):

    def __init__(self, initial=None, sid=None):
        def on_update(self):
            self.modified = True

        CallbackDict.__init__(self, initial, on_update=on_update)
        self.sid = sid
        self.modified = False

# YourSessionProcessor
def open_session(self, app, request):
    # you can find any useful data in request
    # you can find all settings in app.config
    sid = request.cookies.get(app.session_cookie_name)
    # ... do here everything what you need
    return CustomSession(sid=sid)

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-01-12
    • 2022-01-06
    • 2019-10-05
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2017-09-12
    • 2018-08-18
    • 2015-12-30
    相关资源
    最近更新 更多