Как хранить cookie-файл, который будет использоваться между функциями внутри класса? - PullRequest
2 голосов
/ 29 апреля 2011

Мне бы хотелось услышать ваши предложения о том, как эффективно хранить куки, которые будут использоваться внутри класса другими функциями. Мой текущий код выглядит так:

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, и я уверен, что должен быть лучший и более элегантный способ сделать это.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 29 апреля 2011

Во-первых, как заметил jathanism, вы на самом деле не устанавливаете банку с печеньем.

import cookielib
...

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

Затем urllib2.install_opener (opener) установит сошник глобально (!), Что вам не нужно делать. Удалить urllib2.install_opener (opener).

Для запросов без файлов cookie сделайте следующее:

Вам не нужно создавать объект Request, вы можете просто вызвать urlopen с помощью url и params:

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

Для запросов cookie используйте объект открывания:

self.opener.urlopen(url, data)
1 голос
/ 29 апреля 2011
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)

Я прокомментировал материал, который уже был там, чтобы подчеркнуть то, что я изменил.

...