Как установить файлы 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 года.