2009-06-21 34 views
8

Tôi có một đối tượng với CookieJar mà tôi muốn dùng.Làm thế nào để dưa một CookieJar?

Tuy nhiên, như tất cả các bạn có thể đã biết, các cuộn cảm ứng trên các vật thể có chứa các vật thể khóa. Và đối với một số lý do khủng khiếp, một CookieJar có một đối tượng khóa.

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 

Làm cách nào để duy trì điều này?

Giải pháp duy nhất tôi có thể nghĩ đến là sử dụng FileCookieJar.save và FileCookieJar.load cho đối tượng stringIO. Nhưng có cách nào tốt hơn không?

+7

Wow !! Câu hỏi giống như câu hỏi để làm việc trong nhà bếp. Tôi ngạc nhiên với những cái tên được sử dụng cho các công cụ :) – shahkalpesh

+0

Bạn đã có một giải pháp tốt? Nếu có, vui lòng đăng. –

+0

@Paul cả giải pháp của Alex và Anurag đều hoạt động. Trong khi giải pháp của Anurag là hackish và nhanh hơn, giải pháp của Alex là tổng quát hơn và chậm hơn, vì vậy tôi sẽ để nó cho cộng đồng để quyết định cái nào tốt hơn. – Unknown

Trả lời

9

Đây là một nỗ lực, bằng cách phát sinh một lớp học từ CookieJar, ghi đè lên getstate/setstate được sử dụng bởi dưa chua. Tôi đã không sử dụng cookieJar, do đó, không biết nếu nó có thể sử dụng được nhưng bạn có thể đổ lớp dẫn xuất

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

khuyết điểm: nó dựa trên logic nội bộ của CookieJar –

+1

ưu: nó đơn giản và thanh lịch! – Alex

+1

đối với một số định nghĩa về 'thanh lịch' = P. Tuy nhiên, tôi cũng thích cách tiếp cận này. – Claudiu

6

CookieJar không đặc biệt được thiết kế tốt cho sự bền bỉ (đó là những gì các FileCookieJar lớp con chủ yếu là về -!), Nhưng bạn có thể duyệt qua một trường hợp CookieJar để có được tất cả các cookie (và tồn tại một danh sách của những người, ví dụ), và, để xây dựng lại các jar cho các tập tin cookie, sử dụng set_cookie trên mỗi. Đó là cách tôi sẽ đặt các lọ cookie bền bỉ và không bền vững, sử dụng phương pháp copy_reg để đăng ký các chức năng thích hợp nếu tôi cần sử dụng chúng thường xuyên.

+0

Tôi cảm thấy đây là một câu trả lời tốt hơn nhiều so với câu trả lời được chấp nhận. Có thể là dưa chua thực sự là những gì anh ta cần, nhưng có vẻ như không chắc. Các lớp con FileCookieJar đơn giản, đáng tin cậy, di động và sẵn sàng hơn. – rspeed

Các vấn đề liên quan