烧杯作为会话中间件

时间:2012-04-01 14:36:38

标签: python bottle beaker

我正在使用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中存储什么。

我该如何实现?

1 个答案:

答案 0 :(得分:1)

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

为了后人的缘故,代码在这里: https://github.com/paulbarbu/bottle-upload/blob/master/index.py 方法:login_blupload_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
相关问题