GAE:使用SimpleCookie设置多个cookie(或多值cookie)

4 投票
3 回答
2365 浏览
提问于 2025-04-17 05:01

我正在使用Google App Engine。请问我该如何在一次响应中设置多个cookie或者一个包含多个值的cookie呢?

现在我用的代码来自这个网址:http://localhost:8085/server/showcookie?emailAddress=myemail@gmail.com&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="myemail@gmail.com" secretCode=1; Path=/,这不是一个格式正确的header(缺少了逗号)。我该如何创建一个格式正确的cookie,包含这两个值呢?

3 个回答

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)) 
1

所以,C.output() 正在尝试发送两个完整的 cookie 响应头。你把头部名称清空了,所以结果就是两个值用 \r\n 分开。

你需要使用 SimpleCookie 吗?其实你可以直接在 WebOb 的响应对象上 设置 cookies

self.response.set_cookie('emailAddress', self.request.get('emailAddress'))
self.response.set_cookie('secretCode', self.request.get('secretCode'), path='/')
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=''))

撰写回答