[Python] 引用新版 python 的 urlparse 模組來支援 IPv6 網址解析
最近專案遇到一個問題,
python 2.6 的 urlparse 模組無法正確的解析 IPv6 的網址,
而會跳出 exception,例如:
>>> import urlparse >>> parsed = urlparse.urlparse("http://[2001::3]") >>> parsed.hostname '[2001' >>> parsed.port Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/autobuild/TDA_3.8/src/system/src/python/lib/python2.6/urlparse.py", line 102, in port ValueError: invalid literal for int() with base 10: ':3]'
可以看到 hostname 解析不正確 (正常應該是 2001::3),
而要取得 port 時直接跳出了 ValueError exception…
查了一下,python 論壇上已經有人問過這問題了,
但因為官方已經不再支援 python 2.6,
因此這個問題只有修正在 python 2.7 和 python 3 上面….
嗯… 可是我們的專案就是得用 python 2.6,怎麼辦呢?
在 stackoverflow: How to shadow python builtin pwd module 這篇查到了答案~
我們可以把 python 2.7 的 urlparse 模組複製過來,取個不一樣的名字,
再 import 成 urlparse~
這邊如果不是取不一樣的名字的話,pylint 是會警告錯誤的喔~
同時為了確保大家都會用到我們新放進來的 urlparse,
我們把下面這段程式放在專案根目錄的 __init__.py 裡面:
# Import external/urlparseipv6.py. # This file comes from python 2.7.10, which can # deal with IPv6 parsing correctly (the one from python 2.6 cannot). from external import urlparseipv6 as urlparse
上面這樣改好之後,只要是有 import 專案目錄下的模組,
就會自動 import 這個新的 urlparseipv6 模組~
但因為我們 import as urlparse,所以就算有人在程式裡寫了 import urlparse,
也一樣會用到我們先 import 進來的這一份,
程式就都不用修改就能正確解析 IPv6 網址囉~^^
(本頁面已被瀏覽過 543 次)