2008-09-24 45 views
1

我想通过Django设置一个cookie,它有几个不同的值,类似于.NET的HttpCookie.Values属性。看着documentation,我不知道这是否可能。它看起来只是一个字符串,所以有另一种方式?Django是否支持多值cookie?

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

回答

6

.NET的多值cookie与您在django中使用分隔符所做的完全相同。他们已经为你抽象了。你在做的事情很好,我认为Django没有什么具体的“解决”这个问题。

我会说你在做正确的事情,不使用多个cookie。通过做你正在做的事情来保持电线上的开销。

0

Django不支持它。最好的办法是将值与任意分隔符分开,然后分割字符串,就像你已经说过的那样。

1

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

1

(晚答案!)

这将是笨重的,但你调用始终使用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)