2012-01-04 75 views
0

默认情况下,Cookie在会话结束时过期,因此用户在关闭浏览器后每次都需要登录。但remember选项怎么样 - 如何设置没有到期日期的cookie?我试图在development.ini文件中添加session.cookie_expires = False,但它没有帮助。如何设置没有过期日期的cookie以及如何设置自定义cookie标头?

还有一个问题:如何设置自定义cookie头(例如lang到主要cookie没有过期日期)?

编辑:

我发现max_age parametr在pyramid.authentication.AuthTktAuthenticationPolicy,它可以让您保存会话之间的cookie。但如何在max_age定义它在__init__.py(config)文件中并且remember me必须定义在登录视图中时如何实现remember me复选框?

+0

您是否在问如何更改会话cookie的到期?如果是这样,你需要告诉我你正在使用的会话工厂。 – 2012-01-04 22:55:47

+0

'pyramid_beaker.session_factory_from_settings'和'session.type = cookie' – 2012-01-04 23:01:03

+0

烧杯的cookie默认为永不过期,所以也许你正在调试错误的东西? – 2012-01-04 23:04:36

回答

3

“记住我”背后的想法是,它是一种持续登录和会话之间的选项。这最好作为一个单独的cookie来实现,如果用户选中该框,则可以设置该Cookie。如果“记住我”意味着如果策略已过期,则应用程序应该将您重新登录,然后只保存一个永不过期的签名cookie。然后,当应用程序因用户未登录而引发HTTPForbidden时,可以检查cookie,看到他们想要被记住,将它们重新登录并将其重定向到他们试图去的地方。这只是一个选择,取决于你“记住我”的意思。

配置金字塔的默认会话工厂

如果您使用的是UnencryptedCookieSessionFactoryConfig会话工厂,则需要通过适当的值的cookie_max_age说法。超时参数也被检查,这是一个存储在cookie中的签名时间戳。结合max_age,会话的实际到期时间将是max_age和timeout的最小值。

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

创建自定义Cookie

要设置您只需要调用response.set_cookie()你想要的参数的自定义Cookie。如果您使用渲染器,则可以访问通过request.response使用的响应对象。否则,如果您自己手动创建响应对象,请将其设置在那里。

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

+0

'BeakerSessionFactoryConfig' – 2012-01-04 23:02:01

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 

这种方式返回的新的cookie保存用户的偏好保持登录会话保存。然而,方式beaker.SessionMiddleware目前正在实施,它只是将cookie设置为2038年1月18日过期。