星期三, 10月 29, 2014

mod_wsgi, flask 與 python3

我是在 OpenShift 上遇到的情況,用 python3 + flask 寫的 web app 沒辦法啟動,用 rhc tail 出現這樣的錯誤訊息:
'module' object has no attribute '__loader__'
用 Google 找,在 StackOverflow 上找到這篇 flask - cannot setup apache 2.2 with mod_wsgi and python 3.3? ,然後跟著提供的線索看到這篇:Problem debugging Flask under Python 3.3 ,謝謝 Eric 提供的 workaround 。
workaround 是這樣的,在初使化 Flask(__name__) 時,加上 instance_path 參數,所以我就改為 Flask(__name__, os.path.join(os.environ['OPENSHIFT_PYTHON_DIR'], 'instance')) ,就解決了。
問 題是出在 flask.Flask 的初始函數裡,Flask.__init__ 在 instance_path 參數為 None 時,會呼叫 auto_find_instance_path() 來取得 instance_path 的值,而 auto_find_instance_path() 又呼叫 flask.helpers 的 find_packages(),find_packages() 使用了 pkgutil.get_loader() 來尋找 module 而導致了錯誤發生。
我在想,或許添加適當的 __init__.py 也可以解決,但就懶得做實驗了,先這樣。

沒有留言: