2011-10-26 63 views
4

我正在使用Google App Engine。如何使用單一響應設置多個Cookie或多值cookie?GAE:使用SimpleCookie設置多個Cookie(或多值cookie)

現在,我使用這個代碼從URL http://localhost:8085/server/[email protected]&secretCode=1

C = Cookie.SimpleCookie() 
C["emailAddress"] = self.request.get('emailAddress') 
C["secretCode"] = self.request.get('secretCode') 
C["secretCode"]["path"] = "/" 
header_value = C.output(header='') 
self.response.headers.add_header("Set-Cookie", header_value) 

不工作,因爲header_value的值是EMAILADDRESS = 「[email protected]」 SECRETCODE = 1; Path = /這不是一個格式正確的標題(它缺少一個逗號)。我怎樣才能創建一個結構良好的cookie與兩個值?

回答

4

使用兩個SimpleCookie對象解決它:

C1 = Cookie.SimpleCookie() 
C1["emailAddress"] = self.request.get('emailAddress') 
C2 = Cookie.SimpleCookie() 
C2["secretCode"] = self.request.get('secretCode') 
C2["secretCode"]["path"] = "/" 
self.response.headers.add_header("Set-Cookie", C1.output(header='')) 
self.response.headers.add_header("Set-Cookie", C2.output(header='')) 
1

因此,C.output()試圖發出2個完整的cookie響應頭。您已清空標題名稱,因此結果是由\ r \ n分隔的2個值。

您是否需要使用SimpleCookie?您可以在WebOb響應對象上使用set cookies directly

self.response.set_cookie('emailAddress', self.request.get('emailAddress')) 
self.response.set_cookie('secretCode', self.request.get('secretCode'), path='/') 
+0

App Engine的功能不支持 「set_cookie」 – zakdances

+1

@yourfriendzak沒有,Web應用程序不使用的WebOb響應對象,因此沒有set_cookie。你應該考慮使用webapp2。 –

1

巴掌在你自己的set_cookie()函數。

import datetime 
import Cookie 

def set_cookie(self, name, value, expires=None): 
    """Set a cookie""" 
    if value is None: 
     value = 'deleted' 
     expires = datetime.timedelta(minutes=-50000) 
    jar = Cookie.SimpleCookie() 
    jar[name] = value 
    jar[name]['path'] = u'/' 
    if expires: 
     if isinstance(expires, datetime.timedelta): 
      expires = datetime.datetime.now() + expires 
     if isinstance(expires, datetime.datetime): 
      expires = expires.strftime('%a, %d %b %Y %H:%M:%S') 
     jar[name]['expires'] = expires 
    self.response.headers.add_header(*jar.output().split(u': ', 1)) 

與您通話

set_cookie('my_cookie', 'things-you-want-to-add-in-the-cookie') 
set_cookie('1d_cookie', 'only-one-day', datetime.timedelta(minutes=1440))