Как мариновать CookieJar? - PullRequest
8 голосов
/ 21 июня 2009

У меня есть объект с 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 ]

9 голосов
/ 21 июня 2009

Вот попытка получить класс из CookieJar, который переопределяет getstate / setstate, используемый pickle. Я не использовал 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)
7 голосов
/ 21 июня 2009

CookieJar не особенно хорошо разработан для сохранения (это то, чем в основном являются подклассы FileCookieJar!), Но вы можете перебрать экземпляр CookieJar, чтобы получить все куки (и сохранить список тех Например,) и, чтобы восстановить банку с учетом файлов cookie, используйте set_cookie на каждом. Вот как я бы настроился на сохранение и отмену сохранения файлов cookie, используя метод copy_reg для регистрации соответствующих функций, если мне нужно было их часто использовать.

...