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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top