2009-06-21 10 views
8

Tengo un objeto con una CookieJar que quiero encurtir.Cómo guardar un CookieJar?

Sin embargo, como todos ustedes probablemente saben, los choques de encurtidos en objetos que contienen objetos de bloqueo. Y por alguna horrible razón, 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 manera mejor?

+7

¡Guau! La pregunta parece una pregunta para trabajar en la cocina. Me sorprenden los nombres utilizados para las herramientas :) – shahkalpesh

+0

¿Obtuviste una buena solución? Si es así, por favor publíquelo. –

+0

@Paul Las soluciones de Alex y Anurag funcionan. Si bien la solución de Anurag es hackosa y más rápida, la solución de Alex es más general y más lenta, por lo que dejaré en manos de la comunidad decidir qué es mejor. – Unknown

Respuesta

9

Este es un intento, al derivar una clase de CookieJar, que reemplaza a getstate/setstate utilizado por pickle. No he usado cookieJar, así que no sé si es utilizable pero puedes 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) 
+0

contras: se basa en la lógica interna de los profesionales de CookieJar –

+1

: ¡es simple y elegante! – Alex

+1

para algunas definiciones de 'elegante' = P. Aunque me gusta este enfoque también. – Claudiu

6

CookieJar no está particularmente bien diseñado por persistir (eso es lo que los FileCookieJar subclases son en su mayoría sobre -!), Pero se puede repetir un ejemplo CookieJar para obtener todas las cookies (y persistir una lista de los que, por ejemplo), y, para reconstruir el frasco dado las cookies, use set_cookie en cada una. Así es como establecería las cookies persistentes y no visibles, usando el método copy_reg para registrar las funciones apropiadas si tuviera que usarlas con frecuencia.

+0

Creo que esta es una respuesta mucho mejor que la que fue aceptada. Es posible que el decapado sea realmente lo que necesita, pero parece bastante improbable. Las subclases FileCookieJar son más simples, confiables, portátiles y listas para usar. – rspeed