首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何腌制CookieJar?

如何腌制CookieJar?
EN

Stack Overflow用户
提问于 2009-06-21 04:46:08
回答 2查看 3.3K关注 0票数 9

我有一个带有CookieJar的对象,我想要对其进行泡菜处理。

但是,正如您可能都知道的那样,pickle会在包含锁对象的对象上阻塞。出于某种可怕的原因,CookieJar有一个锁对象。

代码语言:javascript
复制
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

我该如何坚持下去呢?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-21 05:01:30

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

代码语言:javascript
复制
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)
票数 9
EN

Stack Overflow用户

发布于 2009-06-21 04:56:20

CookieJar对于持久化的设计并不是特别好(这正是FileCookieJar子类的主要用途!-),但是您可以遍历CookieJar实例以获取所有cookies (例如,持久化这些cookies的列表),并且,要在给定cookies的情况下重新构建jar,请在每个cookies上使用set_cookie。这就是我开始持久化和取消持久化cookie jars的方法,如果我需要经常使用它们,可以使用copy_reg方法来注册适当的函数。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1023224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档