كيفية مخلل و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 تستخدم من قبل المخلل. أنا لم تستخدم 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
للحصول على كافة ملفات تعريف الارتباط (وتستمر قائمة هؤلاء، على سبيل المثال)، و ، لإعادة بناء جرة نظرا لالكوكيز، استخدم set_cookie
في كل منها. هذه هي الطريقة التي أود أن مجموعة إزاء استمرار وunpersisting كوكي الجرار، وذلك باستخدام طريقة copy_reg
لتسجيل الوظائف المناسبة إذا كنت بحاجة إلى استخدام كثير من الأحيان.