0

我想创建基于 cookie 的身份验证取决于路径,所以只是为了测试我创建了两个视图并分别设置 cookie

查看 1 Cookie 与全局可用 查看 2 Cookie 与特定在此处输入图像描述

在此处输入图像描述

但是这两个视图中的问题只有全局cookie可用

查看 1 在此处输入图像描述

查看 2 在此处输入图像描述

您可以看到两个 cookie 名称相同但路径不同,但是当我们获取 cookie 时,只有全局 cookie 可用

如果我显示 request.META.get('HTTP_COOKIE')) 则所有 cookie 都显示但不在 request.COOKIES.get('last_visit')

在此处输入图像描述

请帮忙,我已经在 php 中测试过,它工作正常,但在 python django 中不行

4

1 回答 1

1

您面临的问题部分与 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)
于 2018-03-05T20:56:01.257 回答