2011-11-30 27 views
5

Chcę, aby moi użytkownicy przechodzili do chronionego katalogu w mojej domenie. Zarówno .htaccess, jak i .htpasswd są tworzone i znajdują się w chronionej bibliotece.Podstawowe uwierzytelnianie HTTP przy użyciu pythona

HTML, który prosi o połączeniu login/hasło to:

<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"> 

Pyton skrypt 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 

Kiedy wprowadzić prawidłową nazwę użytkownika/hasło, wynikowa "strona internetowa" to:

> 

Podejrzewam, że mój kod Pythona "Wynik wydruku" jest niepoprawny. Jak mogę to naprawić?

Odpowiedz

1

Zwrócony obiekt z połączenia urlopen jest bardzo podobny do strumienia otwartego pliku, należy go uzyskać, aby uzyskać dane wyjściowe w postaci read.

Zmień print result do print result.read():

result = urllib2.urlopen(request) 

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

Albo zmień result = urllib2.urlopen(request) do result = urllib2.urlopen(request).read():

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

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

Sprawdź te przykłady: http://docs.python.org/library/urllib2.html#examples

lunchbox

+0

Dziękujemy, Twoja sugestia działa! –

1

Kiedy piszesz:

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

Więc resource.read() # Odczytuje url podobny pliku.

print resource # drukuje repr dla obiektu zasobu, a nie rzeczywista treść.

+0

Dobry dodatek o tym, jak wypisuje 'repr' obiektu. – chown

+0

Dziękujemy, Twoja sugestia jest taka sama jak sugestia @chown. –

Powiązane problemy