我正在使用bottle.py和beaker.middleware.SessionMiddleware
编写一个应用程序:
如何修改session.timeout
和session.cookie_expires
值,以便实现一个登录系统,将用户登录30天?
我已经实现了标准的登录系统,所以在浏览器关闭之前一切都正常,但是如果用户选中了“记住我”复选框,我想修改这些值。
如果用户选中“记住我”复选框,我会想到两种变体:
将session.cookie_expires
和session.timeout
设置为30天,但似乎无法在运行时修改这些值,因为收到的cookie在浏览器会话结束时过期,忽略了运行时的修改。
将session.timeout
设置为30天,并重写名为beaker.session.id
的cookie,写入相同的会话ID但到期日期不同。
但是从第1点开始的运行时问题。仍然存在,似乎我无法访问刚刚用烧杯创建的会话ID,所以我不知道该在cookie中存储什么。
我该如何实现?
最佳答案
我想出的唯一解决方案是实现我自己的小后台,自己设置cookies,不需要烧杯。
为子孙后代着想,密码在这里:
https://github.com/paulbarbu/bottle-upload/blob/master/index.py
方法:login_bl
、upload_view(db)
、is_logged_in
和logout()
。
请注意,这是一些非常旧的代码,尚未准备好生产,请自行承担使用风险,上面链接中的一些代码片段如下:
登录
@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