Django:Cookie设置在30秒后到期实际上是在30分钟到期?

时间:2011-04-05 22:20:40

标签: python django cookies

这是我的代码:

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,那么'Expires'日期是:

Tue Apr 5 23:50:07 2011

我做错了什么?

3 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:1)

对于那些因签名Cookie而遇到同样问题的人,您必须使用max_age属性get_signed_cookie()。我尝试使用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)

答案 2 :(得分:0)

尝试改为:

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

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