4

Python 2.6でモジュールを使用するときに、次のスニペットと同様の方法でモジュールを使用してcookielibHTTPCookieを処理しています。urllib2

import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

クッキーをデータベースに保存したいのですが。何が良いのかわかりません-CookieJarオブジェクトをシリアル化して保存するか、からCookieを抽出してCookieJar保存します。どちらが良いのか、どちらを実装するのかわかりません。CookieJarオブジェクトを再作成することもできるはずです。

誰かが上記で私を助けることができますか?

前もって感謝します。

4

2 に答える 2

9

cookielib.Cookie、そのdocstringを(そのソースで)引用するには、

意図的に非常に単純なクラスです。属性を保持するだけです。

したがって、 (または他のシリアル化アプローチ)は、各インスタンスpickleの保存と復元に適しています。Cookie

についてはCookieJarset_cookie1つのCookieインスタンスを設定/追加します__iter__(後者を使用するにはfor、jarインスタンスでループを実行します)。保持しているすべてのCookieインスタンスを次々に返します。

「データベース上のCookiejar」を作成する方法を確認するために使用できるサブクラスは、BSDDBCookieJar(の一部ですmechanizeが、jarソースコードファイルを具体的に示しただけです)です。メモリ内のすべてのCookieをロードするわけではありませんが、むしろ、それらをself._dbbsddbインスタンス(ほとんどがディスク上にあり、キーと値として文字列のみを持つように制約されたdictに似たハッシュテーブル)であり、シリアル化にpickleを使用します。

操作中にすべてのCookieをメモリに保持することに問題がない場合pickle、jarファイルを作成するのが最も簡単です(もちろん、再起動時にBLOBをDBに入れて、そこから元に戻します)-s = cPickle.dumps(myJar, -1)大きなバイトが得られますjar全体(およびもちろん、Cookieだけでなくそのポリシー)の文字列であり、DBからblobとしてtheJar = cPickle.loads(s)リロードすると再構築されます。s

于 2010-06-12T14:45:05.760 に答える
4

これは私が実装した非常に単純なクラスで、Alexの使用の提案に基づいて文字列との間でCookieをロード/ダンプできますpickle

from cookielib import CookieJar
try:
    import cPickle as pickle
except ImportError:
    import pickle

class StringCookieJar(CookieJar):
    def __init__(self, string=None, policy=None):
        CookieJar.__init__(self, policy)
        if string:
            self._cookies = pickle.loads(string)

    def dump(self):
        return pickle.dumps(self._cookies)
于 2011-02-12T13:08:12.437 に答える