سؤال

ولدي كائن مع 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 لتسجيل الوظائف المناسبة إذا كنت بحاجة إلى استخدام كثير من الأحيان.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top