【问题标题】:Beaker as session middleware烧杯作为会话中间件
【发布时间】:2018-11-22 17:11:11
【问题描述】:

我正在使用bottle.py 和beaker.middleware.SessionMiddleware 编写一个应用程序:

如何修改session.timeoutsession.cookie_expires 的值,以便实现一个让用户登录30 天的登录系统?

我已经实现了标准登录系统,所以在浏览器关闭之前一切正常,但如果用户选中 记住我 复选框,我想修改这些值。

如果用户选中记住我复选框,我想到了两种变体:

  • session.cookie_expiressession.timeout 设置为 30 天,但我似乎无法在运行时修改这些值,因为我收到的 cookie 在浏览器会话结束时过期,忽略了我的运行时修改。

  • session.timeout 设置为 30 天并覆盖名为 beaker.session.id 的 cookie,写入相同的会话 ID 但不同的到期日期。 但是第 1 点的运行时问题仍然存在,我似乎无法访问我刚刚用烧杯创建的会话 id,所以我不知道在 cookie 中存储什么。

我该如何实现?

【问题讨论】:

    标签: python bottle beaker


    【解决方案1】:

    我想出的唯一解决方案是实现自己的小后端并自己设置 cookie,无需烧杯。

    为了后代,代码在这里: https://github.com/paulbarbu/bottle-upload/blob/master/index.py 方法:login_blupload_view(db)is_logged_inlogout()。 请注意,这是一些非常旧的代码,还没有准备好生产,使用风险自负,上面链接中的一些代码 sn-ps 如下:

    登录:

    @post('/login')
    def login_bl(db):
    import hashlib
    
    nick = request.forms.nick.lower()
    password = hashlib.sha1(request.forms.password).hexdigest()
    
    message = {}
    error = None
    
    uid  = get_user_id(db, nick, password)
    
    if uid:
        sess = request.environ.get('beaker.session')
        sess['uid'] = uid
        # .... do other stuff for the logged in user
    

    退出:

    @get('/logout')
    def logout():
    if not is_logged_in():
        redirect('/login')
    else:
        sess = request.environ.get('beaker.session')
        sess.delete()
    
    return template('logout.tpl')
    

    用户登录了吗?

    def is_logged_in():
    '''Check whether the user sent a cookie that holds a Beaker created
    session id
    '''
    
    sess_id = request.cookies.get('beaker.session.id', False)
    
    if not sess_id:
        return False
    
    sess = request.environ.get('beaker.session')
    
    if 'uid' not in sess:
        return False
    
    return True
    

    【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多