将cookielib Cookies存储在数据库中
我正在使用 cookielib
模块来处理 HTTP cookies,配合 urllib2
模块在 Python 2.6 中使用,方式类似于下面的代码片段:
import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
我想把这些 cookies 存储到数据库里。但是我不太清楚哪种方法更好——是把 CookieJar
对象序列化后存储,还是从 CookieJar
中提取 cookies 然后存储。我不知道哪种方法更好,也不知道该怎么实现这两种方法。我还希望能够重新创建 CookieJar
对象。
有人能帮我解决这个问题吗?
提前谢谢大家。
2 个回答
这是我实现的一个非常简单的类,它可以根据Alex的建议,使用pickle
来从字符串中加载或保存cookie。
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)
cookielib.Cookie
,根据它的文档描述,
这是一个非常简单的类。 它只是用来保存一些属性。
所以用 pickle
(或者其他序列化的方法)来保存和恢复每个 Cookie
实例都是可以的。
至于 CookieJar
,set_cookie
方法用来设置或添加一个 cookie 实例,而 __iter__
方法(要使用这个方法,只需对 jar 实例进行一个 for
循环)会一个接一个地返回它所包含的所有 cookie 实例。
你可以查看一个子类,了解如何制作一个“数据库中的 cookie jar”,这个子类是 BSDDBCookieJar(它是 mechanize
的一部分,但我特意指向了 jar 的源代码文件)——它不会把所有的 cookies 都加载到内存中,而是把它们保存在 self._db
中,这个 self._db
是一个 bsddb 实例(主要在磁盘上,像字典一样的哈希表,只能使用字符串作为键和值),并使用 pickle 进行序列化。
如果你可以接受在操作过程中将每个 cookie 都保存在内存中,那么简单地对 jar 进行 pickle
是最简单的(当然,你可以把这个数据放到数据库中,重启时再从那里取回来)——s = cPickle.dumps(myJar, -1)
会给你一个包含整个 jar 的大字节串(当然还包括相关的策略,不仅仅是 cookies),而 theJar = cPickle.loads(s)
则会在你从数据库重新加载 s
作为一个 blob 后重建它。