在数据库中保存cookie(代表用户发出请求)

时间:2011-05-03 14:54:06

标签: database django web-applications cookies

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

此第三方网站没有API,因此我使用URLlib来执行登录。此外,与第三方应用程序的所有交互都是通过Celery队列进行的,因此我的应用程序的前端与我的应用程序向第三方的实际请求之间没有链接

我正在努力想出最好的方法来处理第三方网站返回的Cookie,以便我不必在每次操作时都记录用户。

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

2 个答案:

答案 0 :(得分:1)

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

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)

答案 1 :(得分:1)

扩展上面的答案:

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)