Как мариновать CookieJar?
-
06-07-2019 - |
Вопрос
У меня есть объект с 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. Но есть ли лучший способ?
Решение
Вот попытка получить класс из 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)
Другие советы
CookieJar
не особенно хорошо спроектирован для сохранения (это то, чем в основном являются подклассы FileCookieJar
! -), но вы можете перебирать CookieJar < Экземпляр / code>, чтобы получить все файлы cookie (и сохранить их список, например), и, чтобы перестроить банку с учетом файлов cookie, используйте
set_cookie
для каждого из них. Вот как я бы настроился на сохранение и отмену хранения файлов cookie, используя метод copy_reg
для регистрации соответствующих функций, если мне нужно было их часто использовать.