python problem: http-autentifizierung

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
nonsenz
Beiträge: 232
Registriert: 26.10.2002 20:16:49
Wohnort: berlin

python problem: http-autentifizierung

Beitrag von nonsenz » 30.03.2005 11:49:05

hallo zusammen...

...habe da ein problem bei einem kleinen skript, mit welchem ich webseiten, die passwortgeschuetzt sind, abrufen kann. ich muss dazu sagen, dass ich ein ziemlicher python-neuling bin. hier also mal die zeilen, die es eigentlich tuen sollten (dachte ich):

Code: Alles auswählen

  username='geheim'
  passwd=username
  url=self.absolute_url()

  try:
    passman= urllib2.HTTPPasswordMgrWithDefaultRealm()
    passman.add_password(None, url, username, passwd)
    authhandler = urllib2.HTTPBasicAuthHandler(passman)
    opener = urllib2.build_opener(authhandler)
    fd=opener.open(url)
    render=fd.read()
    fd.close()

  except Exception, inst:
     return 'fail\r'+url+'\r\r'+str(inst)
self.absolute_url() liefert mir eine url der form:

Code: Alles auswählen

http://x.x.x.x:y/bla/bla/index_html

als antwort bekomme ich immer

Code: Alles auswählen

HTTP Error 401: Unauthorized
ich habe dafuer vorlagen benutzt und bin mir nich sicher wo das problem ist. von dem rechner auf dem das skript laueft kann ich mich problemlos via lynx mit dem username anmelden, leider klappt es nicht mit dem skript.

kann mir irgendjemand sagen, ob der fehler in dem skript steckt?

danke schonmal und ciao
nons

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.03.2005 11:54:25

Code: Alles auswählen

username='geheim'
passwd=username 
das soll so sein? Also username = passwort??
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
nonsenz
Beiträge: 232
Registriert: 26.10.2002 20:16:49
Wohnort: berlin

Beitrag von nonsenz » 30.03.2005 12:18:12

ja :)

ich merke grade, dass das skript manchmal funzt und manchmal nicht. ich verwende es in verbindung mit zope und habe das gefuehl, das problem liegt eher bei zope.
oder doch nicht?

dojo
Beiträge: 249
Registriert: 03.11.2004 10:30:21

Beitrag von dojo » 30.03.2005 12:32:06

Ich vermute mal, das Problem liegt darin, dass die Authentifizierung nicht immer verlangt wird, da der http-Server dies speichert. Ich würde mal das Skript so abwandeln, dass er im try-Block die Webseite normal aufruft. Im zugehörigen Except-Block würde ich die Exception aufgrund des HTTP-Errors 401 die im Try-Block geworfen wird abfangen, und erst hier die authentifizierung durchführen.

Gruss

Sunnemer

Benutzeravatar
nonsenz
Beiträge: 232
Registriert: 26.10.2002 20:16:49
Wohnort: berlin

Beitrag von nonsenz » 30.03.2005 13:44:33

hmm...
wie mache ich das am besten. wenn ichs so mache:

Code: Alles auswählen

try: render= self.index_html(self,self.REQUEST, render_for_catalog__=1)
  except:
   try:
    u=urllib.urlopen(url)
    render=u.read()
   except Exception, inst:
    try:
     passman= urllib2.HTTPPasswordMgrWithDefaultRealm()
     passman.add_password(None, url, username, passwd)
     authhandler = urllib2.HTTPBasicAuthHandler(passman)
     opener = urllib2.build_opener(authhandler)
     fd=opener.open(url)
     render=fd.read()
     fd.close()
    except Exception, inst:
     return 'fail'
schmeist er immer den fehler:

Code: Alles auswählen

EOF when reading a line
was mache ich falsch?
ciao
nons

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 30.03.2005 14:34:26

Die ersten Zeilen müssen

Code: Alles auswählen

try:
 result=...
except:
heißen. Und bitte gewöhne dir an, 4 oder mehr Zeichen einzurücken ;)

Benutzeravatar
nonsenz
Beiträge: 232
Registriert: 26.10.2002 20:16:49
Wohnort: berlin

Beitrag von nonsenz » 30.03.2005 14:50:09

leider ist das nicht das problem, habs nur falsch übertragen.
...dass mit dem einrücken gewöhne ich mir an ;-) - versprochen!

Antworten