2012-01-04 3 views
0

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

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

EDIT:

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

+0

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

+0

'pyramid_beaker.session_factory_from_settings' и' session.type = cookie' –

+0

cookie стакана по умолчанию никогда не истекает, так что, возможно, вы отлаживаете неправильную вещь? –

ответ

3

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

Настройки по умолчанию Пирамиды Session Factory

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

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

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

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

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

+0

'BeakerSessionFactoryConfig' –

0

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

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

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

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

Смежные вопросы