Django中的路径特定Cookie

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django中的路径特定Cookie相关的知识,希望对你有一定的参考价值。

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

查看1 Cookie与globalLy可用enter image description here查看2 Cookie与特定

enter image description here

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

查看1 enter image description here

查看2 enter image description here

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

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

enter image description here

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

答案

您面临的问题部分与Django有关,但首先与HTTP cookie机制本身的属性有关。

对路径有效的cookie对其所有子路径也有效(查询字符串无关紧要)。因此,用于last_visit/曲奇也适用于/view2/。有关匹配机制的细节,定义cookie是否适合路径,请参阅RFC6265中的subsection“5.1.4。路径和路径匹配”。

因此,两个cookie都被发送,并且它们在Cookie: HTTP头中列出的顺序是从更具体的路径到更不具体的路径。请参阅RFC6265中的over here

现在,Django逐个处理来自标题的cookie并填充普通的python字典request.COOKIES,当密钥已经存在时重写值。这就是当两个路径的两个cookie都在http请求中发送时,last_visit的值被重写的方式。

虽然Django处理这样的cookie,但是只保留密钥的第一个(而不是最后一个)值更合理,因为它与更具体的路径有关,你可以通过仅使用相同的cookie名称修复问题。相同的水平 - 对于/root/view1//root/view2/,但不适用于/root/。或者您可以转移关于http路径的cookie名称,如下所示:

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)

以上是关于Django中的路径特定Cookie的主要内容,如果未能解决你的问题,请参考以下文章

Django学习手册 - cookie / session

django处理cookie的机制

在pushState上获取路径特定的cookie

js代码片段: utils/lcoalStorage/cookie

[TimLinux] Django 信号

django学习日记-cookie