Стакан в качестве промежуточного программного обеспечения - PullRequest
5 голосов
/ 01 апреля 2012

Я пишу приложение, используя bottle.py и beaker.middleware.SessionMiddleware:

Как я могу изменить значения session.timeout и session.cookie_expires, чтобы я мог реализовать систему входа в систему, которая регистрирует пользователя для30 дней?

Я уже внедрил стандартную систему входа в систему, поэтому все работает до закрытия браузера, но я бы хотел изменить эти значения, если пользователь установит флажок Запомнить меня .

Я подумал о двух вариантах, если пользователь установит флажок Запомнить меня :

  • Установите session.cookie_expires и session.timeout на 30 дней, но этокажется, что я не могу изменить эти значения во время выполнения, потому что файл cookie, который я получаю, истекает в конце сеанса браузера, игнорируя мои изменения во время выполнения.

  • Установите session.timeout в 30дней и перезаписать файл cookie с именем beaker.session.id, записывающий тот же идентификатор сеанса, но другую дату истечения срока действия.Но проблема времени выполнения из пункта 1. остается, и кажется, что я не могу получить доступ к идентификатору сеанса, который я только что создал с помощью beaker, поэтому я не знаю, что хранить в cookie.

Как я могу это реализовать?

1 Ответ

1 голос
/ 03 мая 2012

Единственное решение, которое я придумаю, - это реализовать свой собственный маленький бэкэнд и устанавливать файлы cookie самостоятельно, без мензурки.

Для потомков код здесь: 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
...