Como pickle um Cookiejar?
-
06-07-2019 - |
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?
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
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.