2011-11-30 28 views
5

Tôi muốn người dùng của mình truy cập thư mục được bảo vệ trên miền của tôi. Cả hai .htaccess và .htpasswd đều được tạo và nằm trong thư viện được bảo vệ.Xác thực cơ sở HTTP, sử dụng python

Các html mà yêu cầu một sự kết hợp username/password là:

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

Các python cgi script là:

#!/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 

Khi tôi nhập tên người dùng/mật khẩu kết hợp đúng, 'trang web' kết quả là:

> 

Tôi nghi ngờ rằng mã python của tôi "kết quả in" là không chính xác. Làm thế nào tôi có thể sửa lỗi này?

Trả lời

1

Đối tượng trả về từ cuộc gọi urlopen giống như một luồng tệp đang mở, bạn cần phải read nó để nhận kết quả.

Thay đổi print result-print result.read():

result = urllib2.urlopen(request) 

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

Hoặc, thay đổi result = urllib2.urlopen(request)-result = urllib2.urlopen(request).read():

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

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

Kiểm tra các ví dụ: http://docs.python.org/library/urllib2.html#examples

0.123.

hộp ăn trưa

+0

Cảm ơn bạn, đề xuất của bạn hoạt động! –

1

Khi bạn viết:

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

Vì vậy, resource.read() # Đọc các url như một tập tin.

print resource # in repr cho đối tượng tài nguyên chứ không phải nội dung thực tế.

+0

Bổ sung tốt về cách nó in 'repr' của đối tượng. – chown

+0

Cảm ơn bạn, đề xuất của bạn giống với đề xuất của @chown. –

Các vấn đề liên quan