歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python內置的urllib模塊不支持https協議的解決辦法

Python內置的urllib模塊不支持https協議的解決辦法

日期:2017/3/1 9:36:18   编辑:Linux編程

Django站點使用django_cas接入SSO(單點登錄系統),配置完成後登錄,拋出“urlopen error unknown url type: https”異常。尋根朔源發現是python內置的urllib模塊不支持https協議。

>>> import urllib
>>> urllib.urlopen('http://www.baidu.com')
<addinfourl at 269231456 whose fp = <socket._fileobject object at 0xff98250>>
>>> urllib.urlopen('https://www.baidu.com')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/python27/lib/python2.7/urllib.py", line 86, in urlopen
return opener.open(url)
File "/usr/local/python27/lib/python2.7/urllib.py", line 204, in open
return self.open_unknown(fullurl, data)
File "/usr/local/python27/lib/python2.7/urllib.py", line 216, in open_unknown
raise IOError, ('url error', 'unknown url type', type)
IOError: [Errno url error] unknown url type: 'https'

之所以python內置的urllib模塊不支持https協議是因為編譯安裝python之前沒有編譯安裝類似於openssl這樣的SSL庫,以至於python不支持SSL

因為我用的是CentOS系統所以安裝openssl-devel
sudo yum install openssl-devel

之後重新編譯Python
./configure(可選,因為之前已經配置過,按之前的配置來就行了,而且最好按之前的配置配編譯安裝以免依賴的庫需要重新編譯安裝。)
make
make install

>>> import urllib
>>> urllib.urlopen('https://www.baidu.com')

沒有再報同樣的錯誤。

在安裝完openssl-devel後重新編譯python前也有說需要編輯Modules文件夾內Setup.dist文件的
修改
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
#SSL=/usr/local/ssl
#_ssl _ssl.c \
# -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
# -L$(SSL)/lib -lssl -lcrypto

# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto

但實際測試下來好像並不需要修改這個文件,編譯的時候能自動將SSL庫編譯進python中。

另外需要特別注意的是,重新編譯安裝python後,通過可執行文件名(可能是個連接文件)運行python可能運行的還是老的python,這是因為可執行文件名沒有連接到新的python可執行程序。因此要用最新的python可執行文件名或指向該名字的連接來運行python。

重新編譯安裝python後有可能導致需要重新編譯django,MySQLdb,pycrypto,python-ldap,django-auth-ldap,django_cas,django_cas,pymongo等一些列依賴python的模塊。這裡要特別注意

Python向PHP發起GET與POST請求 http://www.linuxidc.com/Linux/2014-10/107903.htm

《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm

《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm

Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm

在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm

Python 語言的發展簡史 http://www.linuxidc.com/Linux/2014-09/107206.htm

Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved