4

在 Python 2.6 中以类似于以下代码段的方式使用模块时,我正在使用该cookielib模块来处理 HTTP cookie :urllib2

import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

我想将 cookie 存储在数据库中。我不知道什么更好 - 序列化CookieJar对象并存储它或从中提取 cookieCookieJar并存储它。我不知道哪个更好或如何实现它们中的任何一个。我也应该能够重新创建CookieJar对象。

有人可以帮我解决上述问题吗?

提前致谢。

4

2 回答 2

9

cookielib.Cookie, 引用它的文档字符串(在它的源代码中),

故意是一个非常简单的类。它只包含属性。

所以(或其他序列化方法)对于保存和恢复每个实例pickle都很好。Cookie

至于CookieJarset_cookie设置/添加一个 cookie 实例,__iter__(要使用后者,只需for在 jar 实例上执行一个循环)返回它拥有的所有 cookie 实例,一个接一个。

您可以使用一个子类来查看如何在数据库中制作“cookie jar”,它是BSDDBCookieJar(它的一部分mechanize,但我只是专门指向 jar 源代码文件)——它不会将所有 cookie 加载到内存中,但是而是将它们保存在self._db一个 bsddb 实例中(主要是在磁盘上,类似字典的哈希表,仅限于只有字符串作为键和值),并使用 pickle 进行序列化。

如果您可以在操作期间将每个 cookie 保存在内存中,那么简单地picklejar 是最简单的(当然,将 blob 放入 DB 并在重新启动时从那里取回)-s = cPickle.dumps(myJar, -1)给您一个大字节整个 jar 的字符串(及其策略,当然,不仅仅是 cookie),并theJar = cPickle.loads(s)在您s从数据库中重新加载为 blob 后重建它。

于 2010-06-12T14:45:05.760 回答
4

这是我实现的一个非常简单的类,它可以根据 Alex 对 using 的建议从/向字符串加载/转储 cookie pickle

from cookielib import CookieJar
try:
    import cPickle as pickle
except ImportError:
    import pickle

class StringCookieJar(CookieJar):
    def __init__(self, string=None, policy=None):
        CookieJar.__init__(self, policy)
        if string:
            self._cookies = pickle.loads(string)

    def dump(self):
        return pickle.dumps(self._cookies)
于 2011-02-12T13:08:12.437 回答