Frage

Ich habe ein Objekt mit einem CookieJar, die ich beizen möchten.

Allerdings, wie Sie alle wissen wahrscheinlich, Gurke Drosseln auf Objekte, die Sperrobjekte enthalten. Und aus irgendeinem Grunde schrecklich, ein CookieJar hat ein Sperrobjekt.

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

Wie bestehen ich das?

Die einzige Lösung, die ich denken kann, ist FileCookieJar.save und FileCookieJar.load zu einem StringIO Objekt zu verwenden. Aber gibt es einen besseren Weg?

War es hilfreich?

Lösung

Hier ist ein Versuch, durch eine Klasse von CookieJar abzuleiten, die Überschreibung getstate / setstate durch Beize verwendet. Ich habe nicht verwendet CookieJar, so weiß nicht, ob es verwendbar ist, aber Sie können abgeleitete Klasse Dump

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)

Andere Tipps

CookieJar ist nicht besonders gut gestaltete für persistierenden (das ist, was die FileCookieJar Subklassen sind meist etwa -!), Aber Sie können eine CookieJar Instanz durchlaufen alle Cookies zu bekommen (und eine Liste von denen, beispielsweise bestehen bleiben), und , das Glas der Plätzchen gegeben neu zu erstellen, verwenden Sie set_cookie auf jedem. Das ist, wie ich daran, persistierende und unpersisting Keksdosen, mit der copy_reg Methode der entsprechenden Funktionen zu registrieren, wenn ich brauche sie oft zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top