2

我想听听您对如何有效存储 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(),并且我确信必须有更好、更优雅的方法来做到这一点。

谢谢你。

4

2 回答 2

3

首先,正如 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 和参数调用 urlopen:

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

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

self.opener.urlopen(url, data)
于 2011-04-28T23:03:09.783 回答
1
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)

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

于 2011-04-28T23:05:09.773 回答