如何挑选一个CookieJar?

时间:2009-06-21 04:46:08

标签: python persistence pickle cookiejar cookielib

我有一个CookieJar的对象我想腌制。

但是大家都知道,在包含锁定对象的对象上发生窒息。由于一些可怕的原因,CookieJar有一个锁定对象。

from cPickle import dumps
from cookielib import CookieJar

class Person(object):
    def __init__(self, name):
        self.name = name
        self.cookies = CookieJar()

bob = Person("bob")
dumps(bob)

# Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
# cPickle.UnpickleableError: Cannot pickle <type 'thread.lock'> objects

我该如何坚持下去?

我能想到的唯一解决方案是将FileCookieJar.save和FileCookieJar.load用于stringIO对象。但是有更好的方法吗?

2 个答案:

答案 0 :(得分:9)

这是一次尝试,通过从CookieJar派生一个类来覆盖pickle使用的getstate / setstate。我没有使用过cookieJar,所以不知道它是否可用但你可以转储派生类

from cPickle import dumps
from cookielib import CookieJar
import threading

class MyCookieJar(CookieJar):
    def __getstate__(self):
        state = self.__dict__.copy()
        del state['_cookies_lock']
        return state

    def __setstate__(self, state):
        self.__dict__ = state
        self._cookies_lock = threading.RLock()

class Person(object):
    def __init__(self, name):
        self.name = name
        self.cookies = MyCookieJar()

bob = Person("bob")
print dumps(bob)

答案 1 :(得分:7)

CookieJar并不是特别精心设计用于持久化(这是FileCookieJar子类主要关注的内容! - ),但您可以迭代CookieJar实例来获取所有Cookie(并保留一份列表(例如),并且,为了重建给定cookie的jar,在每个上使用set_cookie。这就是我如何设置有关持久化和无法使用cookie的方法,如果我需要经常使用它们,可以使用copy_reg方法注册相应的函数。