2010-06-12 15 views
4

J'utilise le module cookielib pour gérer les cookies HTTP lors de l'utilisation du module urllib2 en Python 2.6 d'une manière similaire à cet extrait:stockage des cookies cookielib dans une base de données

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

Je voudrais stocker la les cookies dans une base de données. Je ne sais pas quoi de mieux - sérialiser l'objet CookieJar et le stocker ou extraire les cookies du CookieJar et de stocker cela. Je ne sais pas lequel est le meilleur ou comment mettre en œuvre l'un ou l'autre. Je devrais être également en mesure de recréer l'objet CookieJar.

Quelqu'un pourrait-il m'aider avec ce qui précède?

Merci d'avance.

Répondre

8

cookielib.Cookie, pour citer son docstring (dans son sources),

est délibérément une classe très simple. Il ne contient que des attributs.

si pickle (ou d'autres approches sérialisation) sont très bien pour la sauvegarde et la restauration de chaque instance Cookie.

Quant à CookieJar, set_cookie ensembles/ajoute une instance cookie, __iter__ (pour utiliser ce dernier, il suffit de faire une boucle for sur l'instance de pot) renvoie toutes les instances de biscuits qu'elle détient, l'un après l'autre.

Une sous-classe que vous pouvez utiliser pour voir comment faire un « cookie jar sur une base de données » est BSDDBCookieJar (partie de mechanize, mais je souligne simplement spécifiquement au fichier de code source de pot) - il ne se charge pas tout cookies en mémoire, mais les conserve dans un self._db qui est une instance de bsddb (la plupart du temps sur le disque, la table de hachage dict-lookalike est limitée à des chaînes et des valeurs) et utilise pickle pour la sérialisation.

Si vous êtes OK avec le maintien de tous les cookies en mémoire pendant les opérations, il suffit pickle le pot est ing simple (et, bien sûr, mettre le blob dans la DB et le récupérer à partir de là quand vous le redémarrage) - s = cPickle.dumps(myJar, -1) vous donne une grande chaîne d'octets pour l'ensemble du pot (et sa politique, bien sûr, pas seulement les cookies), et theJar = cPickle.loads(s) reconstruit une fois que vous avez rechargé s comme un blob de la base de données.

4

Voici une classe très simple que j'ai implémentée qui peut charger/décharger des cookies de/vers une chaîne basée sur la suggestion d'Alex d'utiliser 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)