【问题标题】:GAE: Setting multiple cookies (or a multi-value cookie) with SimpleCookieGAE:使用 SimpleCookie 设置多个 cookie(或多值 cookie)
【发布时间】:2011-11-02 00:57:19
【问题描述】:

我正在使用 Google App Engine。如何使用单个响应设置多个 cookie 或多值 cookie?

现在我正在使用来自 URL 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=/ 不是格式良好的标头(缺少逗号)。如何创建具有两个值的格式良好的 cookie?

【问题讨论】:

    标签: python google-app-engine cookies


    【解决方案1】:

    使用两个 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=''))
    

    【讨论】:

      【解决方案2】:

      因此,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='/')
      

      【讨论】:

      • 应用引擎不支持“set_cookie”
      • @yourfriendzak 不,webapp 不使用 webob 响应对象,因此没有 set_cookie。您应该考虑使用 webapp2。
      【解决方案3】:

      加入你自己的 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)) 
      

      【讨论】:

        猜你喜欢
        • 2012-12-18
        • 2015-10-28
        • 2013-11-19
        • 2013-11-01
        • 2011-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多