Pregunta

Tengo un objeto con un CookieJar que quiero encurtir.

Sin embargo, como probablemente todos sepan, encurtir en los objetos que contienen objetos de bloqueo. Y por alguna razón horrible, un CookieJar tiene un objeto de bloqueo.

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

¿Cómo persisto esto?

La única solución que se me ocurre es usar FileCookieJar.save y FileCookieJar.load en un objeto stringIO. ¿Pero hay una mejor manera?

¿Fue útil?

Solución

Aquí hay un intento, derivando una clase de CookieJar, que anula getstate / setstate utilizado por pickle. No he usado cookieJar, así que no sé si es utilizable, pero puede volcar la clase 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)

Otros consejos

CookieJar no está particularmente bien diseñado para persistir (¡de eso se tratan principalmente las subclases FileCookieJar !), pero puede iterar sobre un CookieJar instancia para obtener todas las cookies (y mantener una lista de ellas, por ejemplo), y, para reconstruir el jar dado a las cookies, use set_cookie en cada una. Así es como establecería los tarros de cookies persistentes y no persistentes, utilizando el método copy_reg para registrar las funciones apropiadas si tuviera que usarlas con frecuencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top