【问题标题】:How to set cookies with no expiration date and how to set custom cookie headers?如何设置没有过期日期的 cookie 以及如何设置自定义 cookie 标头?
【发布时间】:2012-01-04 22:26:13
【问题描述】:

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

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

编辑:

我在pyramid.authentication.AuthTktAuthenticationPolicy 中找到了max_age 参数,它可以让您在会话之间保存一个cookie。但是当max_age__init__.py (config) 文件中定义remember me 复选框并且必须在login 视图中定义remember me 时,如何实现remember me 复选框?

【问题讨论】:

  • 您是在问如何更改会话cookie的过期时间?如果是这样,您需要告诉我您使用的是哪个会话工厂。
  • pyramid_beaker.session_factory_from_settingssession.type = cookie
  • 烧杯的cookies默认是永不过期的,所以也许你调试错了?
  • @Michael Merickel 我正在使用来自 pylons/shootout 项目的身份验证机制:github.com/Pylons/shootout/blob/master/development.ini
  • @Michael Merickel pylons/shootout uses authn_policy = AuthTktAuthenticationPolicy('s0secret'),在文档docs.pylonsproject.org/projects/pyramid/en/latest/api/… 中说:max_age 默认:无。这与 timeout 不同,因为 timeout 代表 cookie 中包含的票证的生命周期,而该值代表 cookie 本身的生命周期。设置此值时,将设置 cookie 的 Max-Age 和 Expires 设置,允许 auth_tkt cookie 在浏览器会话之间持续。

标签: python pyramid beaker


【解决方案1】:

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

创建自定义 Cookies

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

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

【讨论】:

    【解决方案2】:

    这不是正确的方法,但有效。

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

    【讨论】:

      【解决方案3】:

      我一直在寻找类似的解决方案。我正在使用 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 日到期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        • 1970-01-01
        • 2012-09-19
        • 2017-02-19
        • 1970-01-01
        • 2017-03-06
        相关资源
        最近更新 更多