Pergunta

Eu tenho um objeto com um Cookiejar que quer preservar.

No entanto, como vocês provavelmente sabem, bobinas de picles em objetos que contêm objetos de bloqueio. E por alguma razão horrível, um Cookiejar tem um objeto de bloqueio.

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

Como posso persistir isso?

A única solução que eu posso pensar é usar FileCookieJar.save e FileCookieJar.load a um objeto StringIO. Mas há uma maneira melhor?

Foi útil?

Solução

Aqui é uma tentativa, derivando uma classe de Cookiejar, que override GetState / SetState usado por picles. Eu não usei Cookiejar, por isso não sei se é utilizável, mas você pode despejar classe derivada

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)

Outras dicas

Não

CookieJar é particularmente bem concebido para persistir (que é o que as subclasses FileCookieJar são principalmente sobre -!), mas você pode iterar sobre uma instância CookieJar para obter todos os cookies (e persistir uma lista daqueles que, por exemplo), e , para reconstruir o jar dado o cookies, uso set_cookie em cada um. É assim que eu iria definir sobre persistência e unpersisting potes de biscoito, usando o método copy_reg para registrar as funções apropriadas se eu precisava para usá-los muitas vezes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top