【问题标题】:saving cookies in the database (to make a request on behalf of a user)在数据库中保存 cookie(代表用户发出请求)
【发布时间】:2011-05-03 14:54:06
【问题描述】:

我正在 facebook 上创建一个 web 应用程序,允许用户提供第三方网站的登录详细信息,并通过我的应用程序向该服务发出请求。 (即他们有我的应用程序的帐户,以及第 3 方网站的帐户。)

这个第三方网站没有 API,所以我使用 URLlib 来执行登录。此外,与此第 3 方应用程序的所有交互都是通过 Celery Queue 进行的,因此我的应用程序的前端与我的应用程序对第​​ 3 方的实际请求之间没有任何联系

我正在尝试想出最好的方法来管理第三方网站返回的 cookie,这样我就不必在每次操作时都让用户登录。

创建一个将用户映射到 cookie 并将 cookie 序列化到数据库中的表会很疯狂吗?

【问题讨论】:

    标签: database django web-applications cookies


    【解决方案1】:

    对于将来遇到这种情况的任何人,我可以使用 cookielib(urllib 的一部分)将 cookie 保存在数据库中,并创建自己的 cookiejar,将 cookie 转储和加载为可以保存在数据库中的字符串:

    class StringCookieJar(cookielib.CookieJar):
        def __init__(self, cookie_string="", policy=None):
            cookielib.CookieJar.__init__(self, policy)
                if cookie_string:
                    self._cookies = pickle.loads(cookie_string)
        def dump(self):
                return pickle.dumps(self._cookies)
    

    在创建连接对象的实例时,我使用自定义 cookielib 设置了 urllib 打开器:

    self.cookiejar = StringCookieJar(cookie_string=str(self.account.cookies))
    self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookiejar))
    

    其中 self.account.cookies 是我用来存储我的 cookie 字符串的数据库中的字段:

    cookies = models.CharField(max_length=2000, blank=True)
    

    【讨论】:

      【解决方案2】:

      扩展上面的答案:

      class MyConnection(models.Model):
          cookie_text = models.TextField(blank=True, null=True, editable=False)
      
          def __init__(self, *args, **kwargs):
              self.cookie_jar = StringCookieJar(self.cookies)
      
          def save(self, *args, **kwargs):
              self.cookies = self.cookie_jar.dump()
              return super(Connection, self).save(*args, **kwargs)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        相关资源
        最近更新 更多