Хранение куки Cookielib в базе данных - PullRequest
4 голосов
/ 12 июня 2010

Я использую модуль cookielib для обработки файлов cookie HTTP при использовании модуля urllib2 в Python 2.6 способом, подобным этому фрагменту:

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

Я бы хотел сохранить куки в базе данных. Я не знаю, что лучше - сериализуйте объект CookieJar и сохраните его или извлеките файлы cookie из CookieJar и сохраните их. Я не знаю, какой из них лучше или как их реализовать. Я также должен быть в состоянии воссоздать объект CookieJar.

Может ли кто-нибудь помочь мне с вышеуказанным?

Заранее спасибо.

Ответы [ 2 ]

9 голосов
/ 12 июня 2010

cookielib.Cookie, чтобы процитировать его строку документации (в источниках ),

намеренно очень простой класс.Он просто содержит атрибуты.

, поэтому pickle (или другие подходы к сериализации) прекрасно подходят для сохранения и восстановления каждого Cookie экземпляра.

Что касается CookieJar, set_cookie устанавливает / добавляет один экземпляр cookie, __iter__ (чтобы использовать последний, просто выполните цикл for на экземпляре jar), возвращает все экземпляры cookie, которые он содержит, один за другим.

Подклассчто вы можете использовать, чтобы увидеть, как создать «jar cookie для базы данных»: BSDDBCookieJar (часть mechanize, но я только что указал конкретно на файл исходного кода jar) - это не такзагружает все файлы cookie в память, а хранит их в self._db, который является экземпляром bsddb (в основном на диске, похожая на диск хэш-таблица, ограниченная наличием только строк в качестве ключей и значений) и использует pickle для сериализации.

Если вы в порядке в порядке, сохраняя каждый файл cookie в памяти во время операций, просто pickle использовать банку проще всего (и, конечно, поместить большой двоичный объект в БД и получить его оттуда).когда ты перезагружаешься) -- s = cPickle.dumps(myJar, -1) дает вам большую байтовую строку для всего jar (и, конечно, ее политику, а не только куки), и theJar = cPickle.loads(s) перестраивает ее, как только вы перезагрузите s как большой двоичный объект из БД.

4 голосов
/ 12 февраля 2011

Вот очень простой класс, который я реализовал, который может загружать / выгружать куки из / в строку, основываясь на предложении Алекса использовать 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)
...