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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 05 января 2012

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

Настройка фабрики сеансов 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#pyramid.session.UnencryptedCookieSessionFactoryConfig

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

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

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

0 голосов
/ 11 августа 2014

Я искал подобное решение.Я использую 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 года.

0 голосов
/ 26 марта 2014

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

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()
...