¿Cómo encurtir un CookieJar?
-
06-07-2019 - |
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?
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.