最近开始学习用python做web开发,参考书为python核心编程第三版,遇到了python的HTTP验证问题,发现验证出错,本人使用Mac Pro 10.12,安装python3,pycharm编程,查阅很多资料都是python2或者windows系统,解决方案比较旧,写这篇文章来纪念一下头一次解决学习问题的鸡冻心情,并以此开博,同时致敬可爱的学长,努力向他看齐。
1.首先,写下python3的http验证脚本(urlopen_auth3.py),并标注出了与python2的不同,及书上代码的错误。
import urllib.request,urllib.parse,urllib.error #python2中为urllib2,到python3中归到urllib中,并分为几个模块
LOGIN = 'wesley'
PASSWD = "you'llNeverGuess"
URL = 'http://localhost'
REALM = 'Secure Archive'
def handler_version(url):
hdlr = urllib.request.HTTPBasicAuthHandler() #python2中为 .. = urllib2.HTTPBas..
hdlr.add_password(REALM,urllib.parse.urlparse(url)[1],LOGIN,PASSWD) #python2中为 ..(REALM,urlparse(url)..
opener = urllib.request.build_opener(hdlr) #python2中为 .. = urllib2.build_opener..
urllib.request.install_opener(opener) #python2中为 urllib2.instal..
return url
def request_version(url):
from base64 import b64encode #python2中为 ..import encodestring ,此处书上错误,python3中base64没有encodestring,编码为b64encode
#对应解码为b64decode
req = urllib.request.Request(url) #python2中为 ..= urllib2.Request..
b64str = b64encode(bytes('%s:%s' % (LOGIN,PASSWD),'utf-8'))[:-1]. #同样,书上错误,此处应使用b64encode
req.add_header("Authorization","Basic %s" % b64str)
return req
for funcType in ('handler','request'):
print('*** Using %s: ' % funcType.upper())
url = eval('%s_version' % funcType)(URL)
f = urllib.request.urlopen(url). #python2中为 ..= urllib2.urlopen..
print(str(f.readline(),'utf-8')) #python3与python2的print语法不同,python2中为 print f.readline()
f.close()
2.运行程序,报错,大概报错内容如下

首先要说明的是,URL已经设为http://localhost,此时需要检查localhost是否指向127.0.0.1,在终端ping一下检查。
打开终端,输入 ping localhost,运行如下,即说明指向正确
若此时出现了指向不是127.0.0.1的情况,需要重新设置,本人此处小小推荐一下
https://superuser.com/questions/541961/mac-os-x-mountain-lion-cant-ping-telnet-localhost-point-to-a-wrong-public-ip
是英文的,本人看了感觉解答不错,有需要可以看看。
3.代码和localhost的IP都没有问题,但依旧报错 connection refused 访问被拒绝,且同时,Safari无法打开http://localhost,说明网络方面依旧有问题。此时需要对Mac的web sharing设置更改。
对于Mac 10.8之前的系统,打开web sharing比较简单,只需从设置改变,方法如下:
打开System preferences -->Sharing,左侧列表中会有web sharing选项,勾选打开。
对于Mac 10.8之后的系统,则没有此选项,需要 打开终端,输入以下代码:
$ sudo apachectl start
$ sudo apachectl stop
$ sudo apachectl restart
$ http -v
此时,用safari打开localhost测试,显示为 It works! 此时打开成功。
4.此时回到pycharm中运行urlopen_auth3.py,可以运行,无报错。
验证成功。
此处还要说明一下,本人在尝试的过程中还在终端运行了其他代码,按照参考文章的意思,应该是要设置为访问 http://localhost/~username ,但最后结果没有访问,不太清楚这段代码有没有起到作用,留做一个问题。
参考文章:http://blog.163.com/chenchen..1986/blog/static/7606314620141871119631/
此处就不做记录了。