我有一个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对象。但是有更好的方法吗?

有帮助吗?

解决方案

这是一次尝试,通过从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)

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top