2011-11-30 11 views
5

Desidero che i miei utenti visitino una directory protetta nel mio dominio. Sia .htaccess che .htpasswd vengono creati e risiedono nella libreria protetta.Autenticazione di base HTTP, utilizzando python

il codice HTML che richiede una combinazione username/password è:

<form method="post" enctype="multipart/form-data" action="bin/logintest.cgi"> 
Username: <input type="text" name="username" size="20" value="please enter.."><br> 
Password: <input type="password" name="password" size="20"><BR> 
<input name="submit" type="submit" value="login"> 

Il pitone script CGI è:

#!/usr/bin/python 

import urllib2 
import base64 
import cgi 

form = cgi.FieldStorage() 
username = form.getfirst("username") 
password = form.getfirst("password") 

request = urllib2.Request("http://www.mydomain.com/protecteddir/index.html") 
base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '') 
request.add_header("Authorization", "Basic %s" % base64string) 
result = urllib2.urlopen(request) 

print "Content-type: text/html\n\n" 
print result 

Quando entro in una corretta combinazione username/password, la "pagina web" risultante è:

> 

Sospetto che il mio codice Python "risultato di stampa" non sia corretto. Come posso risolvere questo?

risposta

1

L'oggetto restituito da una chiamata urlopen è molto simile a un flusso di file aperto, è necessario read per ottenere l'output.

Change print result-print result.read():

result = urllib2.urlopen(request) 

print "Content-type: text/html\n\n" 
print result.read() 

Oppure, cambiare result = urllib2.urlopen(request)-result = urllib2.urlopen(request).read():

result = urllib2.urlopen(request).read() 

print "Content-type: text/html\n\n" 
print result 

Guarda anche questi esempi: http://docs.python.org/library/urllib2.html#examples

0.123.

portavivande

+0

Grazie, il tuo suggerimento funziona! –

1

Quando si scrive:

resource = urllib2.urlopen(url) 
# Here resource is your handle to the url 
# resource provides a read function that mimics file read. 

Quindi, resource.read() # legge l'URL come un file.

print resource # stampa repr per l'oggetto risorsa e non il contenuto effettivo.

+0

Buona aggiunta su come stampa il 'repr' dell'oggetto. – chown

+0

Grazie, il tuo suggerimento è lo stesso del suggerimento di @chown. –

Problemi correlati