【问题标题】:Storing cookielib cookies in a database将 cookielib cookie 存储在数据库中
【发布时间】:2010-06-12 14:04:06
【问题描述】:

在 Python 2.6 中使用urllib2 模块时,我正在使用cookielib 模块来处理HTTP cookie,其方式类似于此sn-p:

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

我想将 cookie 存储在数据库中。我不知道什么更好 - 序列化 CookieJar 对象并存储它或从 CookieJar 提取 cookie 并存储它。我不知道哪个更好或如何实现它们中的任何一个。我也应该能够重新创建CookieJar 对象。

有人可以帮我解决上述问题吗?

提前致谢。

【问题讨论】:

    标签: python urllib2 cookielib


    【解决方案1】:

    cookielib.Cookie,引用其文档字符串(在其sources 中),

    故意是一个非常简单的类。 它只是保存属性。

    所以pickle(或其他序列化方法)非常适合保存和恢复每个Cookie 实例。

    对于CookieJarset_cookie 设置/添加一个cookie 实例,__iter__(要使用后者,只需在jar 实例上执行for 循环)返回它持有的所有cookie 实例,在其他。

    您可以使用一个子类来查看如何制作“数据库上的 cookie jar”是BSDDBCookieJarmechanize 的一部分,但我只是专门指出了 jar 源代码文件)——它没有t 将所有 cookie 加载到内存中,而是将它们保存在 self._db 中,这是一个 bsddb 实例(主要是在磁盘上,类似字典的哈希表,仅限于只有字符串作为键和值)并使用 pickle 进行序列化。

    如果您可以在操作期间将每个 cookie 保存在内存中,只需 pickle jar 是最简单的(当然,将 blob 放入数据库并从那里取回当您重新启动时)-s = cPickle.dumps(myJar, -1) 为您提供整个 jar 的大字节字符串(及其策略,当然,不仅仅是 cookie),并且theJar = cPickle.loads(s) 在您重新加载 s 后重建它来自数据库的 blob。

    【讨论】:

      【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2011-02-10
        • 2013-02-20
        • 2012-11-16
        • 1970-01-01
        • 2011-03-17
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多