flask-login 设置session过期时间(2021年5月20日-亲测)

在使用Flask框架进行web开发时,登录模块采用了flask-login插件,遇到了设置session过期时间的问题,网上查到如下办法,经过测试后并未生效(原因不详):

from flask import session
from datetime import timedelta

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')

    username = request.form['username']
    password = request.form['password']
    user = User.get_user(username, password)
    if not user:
        flash('Username or Password is invalid.', 'error')
        return redirect(url_for('.login'))
    login_user(user)
    
    # 设置session过期时间
    session.permanent = True
    app.permanent_session_lifetime = timedelta(minutes=10)
    
    return render_template('index.html')

于是看了Flask的源码,进行了如下配置,得以解决,代码配置如下:

import flask_login
import json
import datetime
from flask import Flask
from flask import request
from flask_cors import CORS
# from flask_log_request_id import RequestID, current_request_id

app = Flask(__name__)

# 设置session过期时间
app.config['PERMANENT_SESSION_LIFETIME'] = datetime.timedelta(minutes=1)

# 解决跨域问题
CORS(app, resources=r'/*')

源码摘录如下,能力不足,未仔细研究,不做详细解释,惭愧:

class ConfigAttribute(object):
    """Makes an attribute forward to the config"""

    def __init__(self, name, get_converter=None):
        self.__name__ = name
        self.get_converter = get_converter

    def __get__(self, obj, type=None):
        if obj is None:
            return self
        rv = obj.config[self.__name__]
        if self.get_converter is not None:
            rv = self.get_converter(rv)
        return rv

    def __set__(self, obj, value):
        obj.config[self.__name__] = value



#
permanent_session_lifetime = ConfigAttribute(
        "PERMANENT_SESSION_LIFETIME", get_converter=_make_timedelta
    )


#
def _make_timedelta(value):
    if not isinstance(value, timedelta):
        return timedelta(seconds=value)
    return value

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Flask应用程序中使用Flask-Login并将用户会话存储在Redis中,可以通过继承Flask-Login的UserMixin类并实现get_id()和from_id()方法来实现。然后使用Flask-Session和Redis扩展将会话存储在Redis中。 以下是一个示例: ```python from flask_login import UserMixin from flask_session import Session from redis import Redis from flask_redis import FlaskRedis redis_store = FlaskRedis() class User(UserMixin): def __init__(self, id): self.id = id @staticmethod def get(user_id): if not user_id: return None user_data = redis_store.get(user_id) if not user_data: return None return User.from_id(user_id) @staticmethod def from_id(user_id): user_data = redis_store.get(user_id) if not user_data: return None return User(user_id) def save(self): redis_store.set(self.id, {'id': self.id}) app.config['SESSION_TYPE'] = 'redis' app.config['SESSION_REDIS'] = Redis(host='localhost', port=6379) app.config['SESSION_USE_SIGNER'] = True Session(app) redis_store.init_app(app) ``` 在上面的示例中,我们创建了一个名为User的类,在其中实现了get_id()和from_id()方法。这些方法用于从Redis中获取用户数据和将用户数据保存到Redis中。 接下来,我们使用Flask-Session扩展和Redis扩展设置会话存储在Redis中。在初始化应用程序之前,我们需要设置Flask-Session配置和Redis连接配置。 最后,我们使用redis_store.init_app(app)将Redis扩展配置到Flask应用程序中。 这样,我们就可以在Flask应用程序中使用Flask-Login并将用户会话存储在Redis中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值