How to store cookie jar to be used between functions inside class?
I'd like to hear your suggestions on how to effectively store cookies, that are to be used inside a class by other functions. My current code looks like this:
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()
dat开发者_如何学Goa = urllib2.urlopen(conn).read()
return data
Although above example works, I must build custom Request() if I do NOT want to make request with cookies and I am sure there must be better and more elegant way to do this.
Thank you.
First, as jathanism noticed, you are not actually installing the cookie jar.
import cookielib
...
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
Then, urllib2.install_opener(opener) will install the opener globally(!), which you do not need to do. Remove urllib2.install_opener(opener).
For non-cookie requests do this:
You don't need to build the Request object, you can just call urlopen with url and params:
params = urllib.urlencode({'username': username, 'password': password})
urllib2.urlopen('http://somedomain.com/login', params)
For cookie requests, use the opener object:
self.opener.urlopen(url, data)
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)
I commented out the stuff that was already there to highlight what I changed.
精彩评论