2009-06-21 2 views
8

У меня есть объект с CookieJar, который я хочу рассолить.Как рассолить CookieJar?

Однако, как вы все, вероятно, знаете, маринованные дроссели на объектах, которые содержат объекты блокировки. И по какой-то ужасной причине CookieJar имеет объект блокировки.

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 

Как это сохранить?

Единственное решение, о котором я могу думать, это использовать FileCookieJar.save и FileCookieJar.load для объекта stringIO. Но есть ли лучший способ?

+7

Wow !! Вопрос звучит как вопрос для работы на кухне. Я поражен именами, используемыми для инструментов :) – shahkalpesh

+0

Вы получили хорошее решение? Если да, напишите. –

+0

@Paul работают как решения Alex's, так и Anurag. Хотя решение Анурага хакерское и быстрое, решение Алекса является более общим и медленным, поэтому я оставлю его в сообществе, чтобы решить, что лучше. – Unknown

ответ

9

Вот попытка получить класс из CookieJar, который переопределяет getstate/setstate, используемый pickle. Я не использовал cookieJar, поэтому не знаю, можно ли его использовать, но вы можете сбросить производный класс

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

минусы: он полагается на внутреннюю логику CookieJar –

+1

профи: это просто и элегантно! – Alex

+1

для некоторых определений 'elegant' = P. Мне тоже нравится этот подход. – Claudiu

6

CookieJar не особенно хорошо разработан для сохраняющихся (это то, что FileCookieJar подклассов в основном о -!), Но вы можете перебрать CookieJar экземпляр, чтобы получить все кук (и сохраняетесь в списке тех, к примеру), и, чтобы восстановить банку с учетом куки, используйте set_cookie на каждом. Вот как я бы остановился на постоянных и неубедительных банках cookie, используя метод copy_reg, чтобы зарегистрировать соответствующие функции, если мне нужно часто их использовать.

+0

Я чувствую, что это гораздо лучший ответ, чем тот, который был принят. Возможно, травление действительно то, что ему нужно, но это кажется маловероятным. Подклассы FileCookieJar более простые, надежные, портативные и готовые из коробки. – rspeed

Смежные вопросы