为什么我在Django中设置的cookie在jQuery的cookie插件中不按过期时间读取?
我正在尝试创建一个有特定过期时间的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来完成。我觉得这可能和我使用的自定义中间件有关,但我还没能确认这一点。