Django 是不是支持多值 cookie?

Posted

技术标签:

【中文标题】Django 是不是支持多值 cookie?【英文标题】:Does Django support multi-value cookies?Django 是否支持多值 cookie? 【发布时间】:2010-09-12 19:56:04 【问题描述】:

我想通过 Django 设置一个 cookie,它有几个不同的值,类似于 .NET 的 HttpCookie.Values 属性。看着documentation,我不知道这是否可能。看起来只需要一个字符串,那么还有其他方法吗?

我尝试将数组 ([10, 20, 30]) 和字典 ('name': 'Scott', 'id': 1) 传递给它,但它们只是被转换为字符串格式。我目前的解决方案是只使用任意分隔符,然后在读入时解析它,这感觉很恶心。如果多值是不可能的,有没有更好的方法?我宁愿不要使用大量的 cookie,因为那样会很烦人。

【问题讨论】:

【参考方案1】:

.NET 的多值 cookie 的工作方式与您在 django 中使用分隔符的方式完全相同。他们只是为您抽象了这些内容。您所做的一切都很好,而且我认为 Django 没有任何特定的东西可以“解决”这个问题。

我会说你在做正确的事,没有使用多个 cookie。通过做你正在做的事情来降低网络开销。

【讨论】:

【参考方案2】:

如果您正在寻找更抽象的东西,请尝试使用sessions。我相信它们的工作方式是在 cookie 中存储一个与数据库记录匹配的 id。您可以在其中存储任何您想要的东西。它与您正在寻找的不完全相同,但如果您不介意少量的数据库开销,它可以工作。

【讨论】:

【参考方案3】:

(迟到的答案!)

这会比较笨重,但你调用总是使用 python 的内置序列化。

你总是可以这样做:

import pickle
class MultiCookie():
    def __init__(self,cookie=None,values=None):
        if cookie != None:
            try:
                self.values = pickle.loads(cookie)
            except:
                # assume that it used to just hold a string value
                self.values = cookie
        elif values != None:
            self.values = values
        else:
            self.values = None

    def __str__(self):
        return pickle.dumps(self.values)

然后,就可以拿到cookie了:

newcookie = MultiCookie(cookie=request.COOKIES.get('multi'))
values_for_cookie = newcookie.values

或者设置值:

mylist = [ 1, 2, 3 ]
newcookie = MultiCookie(values=mylist)
request.set_cookie('multi',value=newcookie)

【讨论】:

【参考方案4】:

Django 不支持它。最好的方法是用任意分隔符分隔值,然后只拆分字符串,就像你已经说过的那样。

【讨论】:

以上是关于Django 是不是支持多值 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

22,23节Django的GET和POST属性笔记

Django Admin:两个 ListFilter Spanning 多值关系

在 Django 视图中检索 Select2 多值以在后端使用

Django - 数据库支持的会话和基于 Cookie 的会话之间的区别?

Django ORM查询,不同的值并加入同一张表

Django之Session