【问题标题】:How to store cookie jar to be used between functions inside class?如何存储要在类内函数之间使用的cookie jar?
【发布时间】:2011-08-15 02:53:09
【问题描述】:

我想听听您对如何有效存储 cookie 的建议,这些 cookie 将由其他函数在类中使用。我当前的代码如下所示:

class SomeClass:
    def __init__(self, username, password):
        self.logged_in      = False
        self.username       = username
        self.password       = password
        opener              = urllib2.build_opener(urllib2.HTTPCookieProcessor())
        urllib2.install_opener(opener)

    def _login(self, username, password):
        if not self.logged_in:
            params = urllib.urlencode({'username': username, 'password': password})
            conn = urllib2.Request('http://somedomain.com/login', params)
            urllib2.urlopen(conn)
            self.logged_in = True

    def _checkLogin(self):
        if not self.logged_in:
            self._login(self.username, self.password)

    def doSomeStuffThatRequireCookies(self):
        self._checkLogin()
        data = urllib2.urlopen(conn).read()
        return data

虽然上面的示例有效,但如果我不想使用 cookie 发出请求,我必须构建自定义 Request(),并且我确信必须有更好、更优雅的方法来做到这一点。

谢谢。

【问题讨论】:

    标签: python cookiestore


    【解决方案1】:

    首先,正如 jathanism 所注意到的,您实际上并没有安装 cookie jar。

    import cookielib
    ...
    
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) 
    

    然后,urllib2.install_opener(opener) 将全局安装 opener(!),您不需要这样做。删除 urllib2.install_opener(opener)。

    对于非 cookie 请求,请执行以下操作:

    你不需要构建 Request 对象,你可以使用 url 和 params 调用 urlopen:

    params = urllib.urlencode({'username': username, 'password': password})
    urllib2.urlopen('http://somedomain.com/login', params)
    

    对于 cookie 请求,使用 opener 对象:

    self.opener.urlopen(url, data)
    

    【讨论】:

    • 非常感谢。但我认为您忘记在答案的“对于非 cookie 请求执行此操作”部分下添加代码 sn-p。
    • 这个答案对我很有帮助,除了一个小问题。 OpenerDirector 对象没有 urlopen 函数;你答案的最后一行应该是self.opener.open(url, data)
    【解决方案2】:
    import cookielib
    
    class SomeClass:
        def __init__(self, username, password):
            #self.logged_in      = False
            #self.username       = username
            #self.password       = password
            self.cookiejar      = cookielib.CookieJar()
            opener              = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookiejar))
            #urllib2.install_opener(opener)
    

    我注释掉了已经存在的内容以突出我所做的更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2012-02-20
      • 2017-02-13
      • 2016-05-31
      相关资源
      最近更新 更多