0

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

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

编辑:

我在pyramid.authentication.AuthTktAuthenticationPolicymax_age中找到了参数,它可以让你在会话之间保存一个 cookie。但是在(配置)文件中定义复选框并且必须在登录视图中定义时如何实现复选框?remember memax_age__init__.pyremember me

4

3 回答 3

3

“记住我”背后的想法是它是一个在登录和会话之间持续的选项。这最好作为一个单独的 cookie 来实现,如果用户选中该框,您可以设置它。如果“记住我”意味着如果策略过期,应用程序应该让您重新登录,那么只需存储一个永不过期的签名 cookie。然后,当应用程序HTTPForbidden因为用户未登录而引发 an 时,您可以检查 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#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

于 2012-01-04T22:59:41.560 回答
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()
于 2014-03-26T09:39:45.190 回答
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)

但是,每次向服务器发送请求时,bottle 都会返回一个新的会话 cookie,该 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 日到期。

于 2014-08-11T18:13:50.773 回答