[Python] 引用新版 python 的 urlparse 模組來支援 IPv6 網址解析

[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 網址囉~^^

(本頁面已被瀏覽過 501 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料