【问题标题】:How to pickle a CookieJar?如何腌制 CookieJar?
【发布时间】:2009-06-21 04:46:07
【问题描述】:

我有一个要腌制的带有 CookieJar 的对象。

但是,大家可能都知道,pickle 阻塞了包含锁定对象的对象。由于某些可怕的原因,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 对象。但是有没有更好的方法?

【问题讨论】:

  • 哇!!这个问题听起来像是在厨房工作的问题。我很惊讶这些工具使用的名称:)
  • 你找到好的解决方案了吗?如果有,请发帖。
  • @Paul Alex 和 Anurag 的解决方案都有效。虽然 Anurag 的解决方案比较老套且速度更快,但 Alex 的解决方案更通用且速度较慢,因此我将由社区来决定哪个更好。
  • 乍一看还以为是个笑话问题

标签: python persistence pickle cookiejar cookielib


【解决方案1】:

这是一个尝试,通过从 CookieJar 派生一个类来覆盖 pickle 使用的 getstate/setstate。 cookieJar我没用过,不知道能不能用但是可以dump派生类

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的内部逻辑
  • 优点:简单优雅!
  • 对于“优雅”的一些定义=P。不过,我也喜欢这种方法。
【解决方案2】:

CookieJar 不是特别为持久化而设计的(这就是FileCookieJar 子类的主要内容!-),但是您可以遍历 CookieJar 实例以获取所有 cookie(并持久化那些,例如),并且,要重建给定 cookie 的 jar,请在每个上使用 set_cookie。如果我需要经常使用它们,我会使用copy_reg 方法注册适当的函数,这就是我将如何设置持久化和非持久化 cookie 罐的方式。

【讨论】:

  • 我觉得这是一个比被接受的答案更好的答案。可能酸洗真的是他需要的,但似乎不太可能。 FileCookieJar 子类更简单、可靠、可移植且开箱即用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多