Django:设置为30秒后过期的Cookie实际上会在30分钟后过期?

8wtpewkr  于 2023-03-20  发布在  Go
关注(0)|答案(4)|浏览(191)

这是我的代码:

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

我哪里做错了?

kyxcudwk

kyxcudwk1#

您可以使用带有秒数的max_age参数,而不是使用expires;datetime.now()的问题可能是您没有使用UTC(您可以使用datetime.utcnow())。

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

故事的寓意:阅读文档;它解释了您需要使用UTC datetime对象并描述了max_age

ds97pgxw

ds97pgxw2#

对于那些在签名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)
zqdjd7g9

zqdjd7g93#

请尝试:

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

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

z2acfund

z2acfund4#

在Django中,你可以设置max_age参数。在Django 4.1中,max_age应该是一个timedelta对象,一个整数秒数,或者如果cookie只在客户端的浏览器会话中存在,则为None(默认值)。如果没有指定expires,则会计算它。

相关问题