【问题标题】:Does Django support multi-value cookies?Django 是否支持多值 cookie?
【发布时间】:2023-03-06 10:45:02
【问题描述】:

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

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

【问题讨论】:

    标签: python django cookies


    【解决方案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 不支持它。最好的方法是用任意分隔符分隔值,然后只拆分字符串,就像你已经说过的那样。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-29
            • 1970-01-01
            • 2018-06-17
            • 1970-01-01
            • 2013-10-13
            相关资源
            最近更新 更多