Come decapare un CookieJar?
-
06-07-2019 - |
Domanda
Ho un oggetto con un CookieJar che voglio decapare.
Comunque, come probabilmente tutti sapete, sottacete gli strozzamenti su oggetti che contengono oggetti di blocco. E per qualche orribile ragione, un CookieJar ha un oggetto lock.
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
Come posso persistere?
L'unica soluzione che mi viene in mente è usare FileCookieJar.save e FileCookieJar.load su un oggetto stringIO. Ma c'è un modo migliore?
Soluzione
Ecco un tentativo, derivando una classe da CookieJar, che sovrascrive getstate / setstate usato da pickle. Non ho usato cookieJar, quindi non so se è utilizzabile ma puoi scaricare la classe derivata
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)
Altri suggerimenti
CookieJar
non è particolarmente ben progettato per persistere (questo è lo scopo delle sottoclassi FileCookieJar
!), ma puoi iterare su un CookieJar
istanza per ottenere tutti i cookie (e persistere un elenco di quelli, ad esempio) e, per ricostruire il barattolo dato i cookie, utilizzare set_cookie
su ciascuno. È così che vorrei impostare barattoli di cookie persistenti e non persistenti, utilizzando il metodo copy_reg
per registrare le funzioni appropriate se avessi bisogno di usarli spesso.