4

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

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

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

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

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

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

我该如何实施?

4

1 回答 1

1

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

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

登录:

@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-05-03T15:46:03.513 回答