如何设置没有过期日期的cookie以及如何设置自定义cookie标头?

时间:2012-01-04 22:26:14

标签: python pyramid beaker

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

另一个问题:如何设置自定义Cookie标头(例如lang到主Cookie但没有过期日期)?

修改

我在pyramid.authentication.AuthTktAuthenticationPolicy中找到了max_age参数,可让您在会话之间保存Cookie。但是remember me max_age__init__.py(配置)文件中定义remember me时如何实施{{1}}复选框必须在登录视图中定义?

3 个答案:

答案 0 :(得分:3)

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

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

如果您正在使用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

答案 1 :(得分: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()

答案 2 :(得分: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.essionMiddleware目前正在实施,它只是将cookie设置为2038年1月18日到期。