如何设置没有过期日期的cookie以及如何设置自定义cookie标头?
默认情况下,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
复选框?
“记住我”背后的想法是,它是一种持续登录和会话之间的选项。这最好作为一个单独的cookie来实现,如果用户选中该框,则可以设置该Cookie。如果“记住我”意味着如果策略已过期,则应用程序应该将您重新登录,然后只保存一个永不过期的签名cookie。然后,当应用程序因用户未登录而引发HTTPForbidden
时,可以检查cookie,看到他们想要被记住,将它们重新登录并将其重定向到他们试图去的地方。这只是一个选择,取决于你“记住我”的意思。
配置金字塔的默认会话工厂
如果您使用的是UnencryptedCookieSessionFactoryConfig
会话工厂,则需要通过适当的值的cookie_max_age
说法。超时参数也被检查,这是一个存储在cookie中的签名时间戳。结合max_age,会话的实际到期时间将是max_age和timeout的最小值。
创建自定义Cookie
要设置您只需要调用response.set_cookie()
你想要的参数的自定义Cookie。如果您使用渲染器,则可以访问通过request.response
使用的响应对象。否则,如果您自己手动创建响应对象,请将其设置在那里。
'BeakerSessionFactoryConfig' – 2012-01-04 23:02:01
这不是正确的方法,但作品。
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设置为2038年1月18日过期。
您是否在问如何更改会话cookie的到期?如果是这样,你需要告诉我你正在使用的会话工厂。 – 2012-01-04 22:55:47
'pyramid_beaker.session_factory_from_settings'和'session.type = cookie' – 2012-01-04 23:01:03
烧杯的cookie默认为永不过期,所以也许你正在调试错误的东西? – 2012-01-04 23:04:36