Как установить файлы cookie без даты истечения срока действия и как настроить пользовательские заголовки файлов cookie?

По умолчанию срок действия файлов cookie истекает в конце сеанса, поэтому пользователь должен входить в систему каждый раз после закрытия браузера. Но что насчет remember вариант - как установить cookie без срока годности? Я пытался добавить session.cookie_expires = False в файле development.ini, но это не помогло.

И еще вопрос: как установить пользовательский заголовок cookie (например, lang в основной файл cookie без даты истечения срока действия)?

РЕДАКТИРОВАТЬ:

я обнаружил max_age Параметр в pyramid.authentication.AuthTktAuthenticationPolicy, который позволяет сохранять куки между сессиями. Но как реализовать remember me флажок, когда max_age определяет это в __init__.py (config) файл и remember me должны быть определены в представлении входа в систему?

3 ответа

Решение

Идея "помни меня" заключается в том, что эта опция существует между входами в систему и сеансами. Лучше всего это реализовать в виде отдельного файла cookie, который можно установить, если пользователь установит флажок. Если "запомнить меня" означает, что приложение должно войти в систему, если срок действия политики истек, просто сохраните подписанный файл cookie, срок действия которого никогда не истекает. Затем, когда приложение поднимает HTTPForbidden поскольку пользователь не вошел в систему, вы можете проверить наличие файла cookie, увидеть, что он хотел запомнить, войти обратно и перенаправить обратно туда, куда он пытался перейти. Это всего лишь один из вариантов, в зависимости от того, что вы подразумеваете под "запомнить меня".

Настройка фабрики сеансов Pyramid по умолчанию

Если вы используете UnencryptedCookieSessionFactoryConfig фабрика сеанса, то вам нужно передать соответствующее значение для cookie_max_age аргумент. Также проверяется параметр timeout, который представляет собой подписанную временную метку, которая хранится в файле cookie. В сочетании с max_age фактическое время истечения сеанса будет минимальным из max_age и timeout.

http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/api/session.html

Создание пользовательских файлов cookie

Чтобы установить собственный файл cookie, вам просто нужно позвонить response.set_cookie() с параметрами, которые вы хотите. Если вы используете рендерер, вы можете получить доступ к объекту ответа, который используется через request.response, В противном случае, если вы вручную создаете объект ответа, просто установите его там.

http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/api/response.html

Это не правильно, но работает.

def login_user(request, usesr_id, time=None):
"""
@type request: pyramid.request.Request
@type usesr_id: int
@type time: int 
@rtype: Response
"""
request.session["user_id"] = usesr_id
if time is not None:
    request.session._sess.cookie_expires = datetime.timedelta(seconds=time)
    request.session._sess._set_cookie_expires(None)
else:
    request.session._sess.cookie_expires = True
    request.session._sess._set_cookie_expires(None)
request.session._update_cookie_out()
request.session.save()

Я искал подобное решение. Я использую bottle-cork.py для аутентификации пользователя, и мне нужен был способ дать пользователям возможность "держать меня в системе"

from bottle, import request, response # etc...

def post_get(name, default=''):
    return bottle.request.POST.get(name, default).strip()

def login():
    """Authenticate users"""
    username = post_get('username').lower()
    password = post_get('password')
    keep_login = post_get('keep_login')
    session = request.environ['beaker.session']
    if keep_login == 'true':
        session.cookie_expires = False
        response.set_cookie('keep_login', "true")
    else:
        session.cookie_expires = True
        response.set_cookie('keep_login', "false")
    aaa.login(username, password)

Однако каждый раз, когда запрос отправляется на сервер, бутылка возвращает новый файл cookie сеанса, который по умолчанию возвращается к истечению, когда браузер закрывается. Чтобы это исправить, я добавил функцию, которую я вызываю при каждой отправке запроса:

def preserve_cookie(request):
    keep_login = request.get_cookie('keep_login')
    session = request.environ['beaker.session']
    if keep_login == 'true':
        session.cookie_expires = False
    return request

Так, например:

@bottle.get('/get_username')
def check_login(user=None):
    try:
        aaa.require(username=user)
    except:
        raise bottle.HTTPError(401)
    preserve_cookie(request)
    return aaa.current_user.username

Таким образом, новый файл cookie, который возвращается, сохраняет предпочтение пользователя сохранять сеанс входа в систему сохраненным. Однако способ beaker.SessionMiddleware в настоящее время реализован, он просто устанавливает срок действия файла cookie до 18 января 2038 года.

Другие вопросы по тегам