您面临的问题部分与 Django 有关,但首先与 HTTP cookie 机制本身的属性有关。
对路径有效的 cookie 也对其所有子路径有效(查询字符串无关紧要)。因此last_visit
,用于的 cookie/
也适用于/view2/
. 有关匹配机制的细节,定义 cookie 是否适合路径,请参阅RFC6265中的“5.1.4. Paths and Path-Match”小节。
因此,两个 cookie 都被发送,它们在Cookie:
HTTP 标头中列出的顺序是从更具体的路径到不太具体的路径。请参阅RFC6265 中的此处。
现在,Django 一个一个地处理来自标头的 cookie 并填充一个普通的 python 字典request.COOKIES
,当键已经存在时重写值。last_visit
这就是在 http 请求中发送两个路径的两个 cookie 时重写您的值的方式。
虽然 Django 处理这样的 cookie,但只保留键的第一个(不是最后一个)值会更合理,因为它与更具体的路径相关,但您可以通过仅对路径使用相同的 cookie 名称来解决问题同一级别 - 为/root/view1/
and /root/view2/
,但不为/root/
. 或者您可以将 cookie 名称转移到 http 路径,如下所示:
import hashlib
cookie_name = 'last_visit%s' % hashlib.md5(request.path).hexdigest()
# ...
cookie = request.COOKIES.get(cookie_name)
# ...
response.set_cookie(cookie_name, cookie, path=request.path)