为什么我在Django中设置并在jQuery的cookie插件中读取的cookie没有使用我的过期时间?

为什么我在Django中设置并在jQuery的cookie插件中读取的cookie没有使用我的过期时间?,jquery,python,django,cookies,Jquery,Python,Django,Cookies,我正在尝试创建一个具有特定过期时间的cookie。我使用以下代码在django视图中设置它: from datetime import datetime response.set_cookie('cookie_name', 'cookie_value', expires=datetime.today() + timedelta(20*365), path='/path/to/cookie/') if ($.cookie("cookie_name") == "True") { $.coo

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

from datetime import datetime
response.set_cookie('cookie_name', 'cookie_value', expires=datetime.today() + timedelta(20*365), path='/path/to/cookie/')
if ($.cookie("cookie_name") == "True") {
    $.cookie("cookie_name", "False");
}
else {
    $.cookie("cookie_name", "True");
}
我正在使用jQuery cookie插件读取cookie的值,代码如下:

from datetime import datetime
response.set_cookie('cookie_name', 'cookie_value', expires=datetime.today() + timedelta(20*365), path='/path/to/cookie/')
if ($.cookie("cookie_name") == "True") {
    $.cookie("cookie_name", "False");
}
else {
    $.cookie("cookie_name", "True");
}
我的主要问题是,cookie被视为会话cookie,因为它显示在资源选项卡的Chromium developer cookie列表中的Cookies下。为什么我的cookie的过期时间没有被看到,或者被重置?我可以验证cookie是否是会话cookie,因为如果我关闭浏览器并重新打开,cookie不在那里

使现代化 根据中的答案,我将cookie django代码更改为:

根据Chromium的说法,我的cookie仍然是会话cookie

更新2 我也试着忽略过期,只设置最大年龄,但我仍然遇到同样的问题

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应该计算最大年龄。在这里,我真的很困惑。

还要设置最大年龄。如果没有,浏览器将在会话完成时抛出cookie。或者更好的是,只需指定最大年龄,而不是过期,过期时间将为您计算


进一步调查后,您使用的是日期对象,expires需要datetime对象。因此,您需要立即执行datetime.datetime.now而不是datetime.date.today

以您的更新2为基础,我似乎无法复制此问题

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?1.3和1.3.1都为我正确设置了cookie


你也在其他浏览器上测试过吗?这里似乎有一些更一般的东西在手。

我能够通过将Django从等式中去掉,并通过jQuery cookie来完成与cookie相关的所有工作,从而绕过这个问题。我认为这可能与我正在使用的自定义中间件有关,但我无法确认这一点。

datetime.today是我正在使用的,而不是datetime.date.today。此外,如果设置了expires,django将设置最大年龄。