为什么我在Django中设置的cookie在jQuery的cookie插件中不按过期时间读取?

0 投票
3 回答
622 浏览
提问于 2025-04-17 06:08

我正在尝试创建一个有特定过期时间的cookie。我在我的Django视图中用以下代码设置它:

from datetime import datetime
response.set_cookie('cookie_name', 'cookie_value', expires=datetime.today() + timedelta(20*365), path='/path/to/cookie/')

我使用jQuery Cookie插件读取这个cookie的值,代码如下:

if ($.cookie("cookie_name") == "True") {
    $.cookie("cookie_name", "False");
}
else {
    $.cookie("cookie_name", "True");
}

我主要的问题是,这个cookie被视为会话cookie(在Chromium开发者工具的资源标签下的cookie列表中可以看到)。为什么我的cookie的过期时间没有被识别,或者被重置了呢?我可以确认这个cookie是会话cookie,因为如果我关闭浏览器再打开,这个cookie就不见了。

更新

根据这个帖子的回答,我把Django中的cookie代码改成了以下内容:

from datetime import datetime
max_age = 20*365*24*60*60 #twenty years
expires = datetime.strftime(datetime.utcnow() + timedelta(seconds=max_age), "%a, %d-%b-%Y %H:%M:%S GMT")
response.set_cookie(key='cookie_name', value='cookie_value', max_age=max_age, expires=expires, path='/path/to/cookie/')

根据Chromium的显示,我的cookie仍然是会话cookie。

更新 2

我还尝试只设置max_age而不设置expires,结果还是出现同样的问题。

max_age = 20*365*24*60*60 #twenty years
expires = datetime.utcnow() + timedelta(seconds=max_age)
response.set_cookie(key='advisees', value=limit_to_advisees, expires=expires, path='/path/to/cookie/')

Django应该会在没有提供max_age的情况下自动计算它。我对此感到很困惑。

3 个回答

0

还要设置 max_age。否则,当会话结束时,浏览器会把这个 cookie 给扔掉。更好的做法是只指定 max_age,而不是 expires,这样 expires 会自动为你计算出来。

经过进一步调查,你发现你在使用一个日期对象,而 expires 需要的是一个日期时间对象。所以你应该用 datetime.datetime.now(),而不是 datetime.date.today()。

0

根据你的更新2,我似乎无法重现这个问题。

你使用的Django是什么版本?我这边1.3和1.3.1都能正确设置cookie。

你有没有在其他浏览器上测试过?看起来这里面可能有更普遍的问题。

0

我解决这个问题的方法是把Django放到一边,所有和cookie相关的操作都通过jQuery Cookie来完成。我觉得这可能和我使用的自定义中间件有关,但我还没能确认这一点。

撰写回答