2 Stimmen

Wie speichert man ein Cookie-Glas, das zwischen Funktionen innerhalb einer Klasse verwendet wird?

Ich würde gerne Ihre Vorschläge hören, wie man Cookies, die innerhalb einer Klasse von anderen Funktionen verwendet werden sollen, effektiv speichern kann. Mein aktueller Code sieht wie folgt aus:

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

Obwohl obiges Beispiel funktioniert, muss ich benutzerdefinierte Request() erstellen, wenn ich KEINE Anfrage mit Cookies stellen möchte, und ich bin sicher, dass es einen besseren und eleganteren Weg geben muss, dies zu tun.

Ich danke Ihnen.

3voto

theduke Punkte 2896

Erstens, wie jathanism bemerkte, installieren Sie die Keksdose nicht wirklich.

import cookielib
...

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

Dann wird urllib2.install_opener(opener) den Opener global(!) installieren, was Sie nicht tun müssen. Entfernen Sie urllib2.install_opener(opener).

Für Nicht-Cookie-Anfragen tun Sie dies:

Sie brauchen das Request-Objekt nicht zu erstellen, Sie können einfach urlopen mit url und params aufrufen:

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

Für Cookie-Anfragen verwenden Sie das Opener-Objekt:

self.opener.urlopen(url, data)

1voto

jathanism Punkte 31729
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)

Ich habe die Dinge, die bereits vorhanden waren, auskommentiert, um hervorzuheben, was ich geändert habe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X