【问题标题】:Django: Cookie set to expire in 30 seconds is actually expiring in 30 minutes?Django:设置为在 30 秒内过期的 Cookie 实际上在 30 分钟内过期?
【发布时间】:2011-07-30 09:04:50
【问题描述】:

这是我的代码:

def update_session(request):
    if not request.is_ajax() or not request.method=='POST':
       return HttpResponseNotAllowed(['POST'])
    user_id = request.POST.get('u')
    hr = set_terminal_cookie(user_id)
    return hr

def set_terminal_cookie(user_id):
    print 'set_terminal_cookie'
    hr = HttpResponse('ok')
    print datetime.datetime.now()
    expiry_time = datetime.datetime.now() + datetime.timedelta(seconds=30)
    print expiry_time
    hr.set_cookie('user_id', user_id, expiry_time)
    return hr 

这是日志输出:

set_terminal_cookie
2011-04-05 23:16:36.706624
2011-04-05 23:17:06.706806

但是,如果我随后在 Firefox 中检查“user_id”cookie,则“过期”日期为:

Tue Apr 5 23:50:07 2011

我做错了什么?

【问题讨论】:

    标签: python django cookies


    【解决方案1】:

    试试吧:

    hr.set_cookie('user_id', user_id, max_age=30)
    

    max_age 参数是您希望 cookie 持续的秒数。

    【讨论】:

      【解决方案2】:

      您可以使用带有秒数的max_age 参数来代替expires;它会为你计算expiresdatetime.now() 的问题可能是您没有使用 UTC(您可以改用 datetime.utcnow())。

      hr.set_cookie('user_id', user_id, max_age=30)
      

      故事的寓意:read the documentation;它解释了您需要使用 UTC datetime 对象并描述了 max_age

      【讨论】:

      • 谢谢!我试图阅读文档,但由于某种原因它没有进入......
      【解决方案3】:

      对于那些遇到与签名 cookie 相同的问题的用户,您必须使用 get_signed_cookie()max_age 属性。我尝试使用set_signed_cookie() 方法设置它,但再次获取它时不起作用。

      所以这不会使您的 cookie 过期:

      cookie_max_age = settings.TWO_FACTOR_REMEMBER_USER_SECONDS
      response.set_signed_cookie('key', max_age=cookie_max_age)
      

      但是当像下面这样获取它时,它应该可以工作(无论是否在 cookie 上设置 max_age):

      cookie_max_age = 3600
      cookie = request.get_signed_cookie('key', max_age=cookie_max_age)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-17
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        • 2011-07-01
        • 2011-11-23
        相关资源
        最近更新 更多