カラクリスタ

『輝かしい青春』なんて失かったヒトのブログ

Google App EngineでBabelを使う時はBabelをzipimportでimportしてはならない

概要: Babel on GAEしたい時はBabelを生で使うべし


最近Google App Engineを使ったWeb Serviceをひっそりと開発していて、 そのApplicationはFlaskbuildoutを組み合わせて管理してたんだけど、 今日Flask-Babel使って国際化しようとしてたら、構築されてた環境の影響で鬼はまりしてたので、 それを忘れない様にメモっておく。

0. 前提環境

まず、僕のWeb Applicationは、

を参考に環境構築して作ってる。

で、上記サイトで公開されてりるbuildout.cfgでは、 関連ライブラリをdistlib.zipとして一つのファイルにまとめる、 という処理が使われています。

で、僕の環境では関連ライブラリをdistlib.zipにまとめて読み込む、 という処理をしていました。

1. 質問: 何ではまったか

解答: Flask-Babel使おうとしてはまった

症状としてFlask-Babelのチュートリアル通りに事を進めても、 UnkownLocaleErrorが延々とで続けるというもの。

2. 質問: 原因は何か

解答: Babelがファイルシステムから読み込んでたファイルがzipimport使ったことにより読み込めなかったため

で、多分これで合ってると思いますが、 Babelファイルシステム上からファイルを読み込むようになっていて、 かつzipimportはpythonのcode以外読み込めないという仕様から、 distlib.zipからBabelに必要な.datファイルが読み込めなかったため、 延々とUnknownLocaleErrorが出てた、という状態だったらしい。

3. 質問: 解決方法は?

解答: Babelは生で使うべし。distlib.zipに放り込んではならない。

まあ症状として上記の通りだったんですが、 実際にBabelのファイルを生のライブラリを読み込むディレクトリに配置して、 ライブラリを読み込む順番を生のライブラリを先に読み込むようにしたところ、 なんか問題なく表示されましたとさ。

まあナニソレって感じでした。orz

4. 以上で終わり

まあ解決できてよかったーって感じではありますが、とりあえず今日の1:00頃3:40頃まで、 時間をずっとこの問題解決に費やしておりましたとさ。いやぁ本当時間食ったし疲れたわ><

まあこういう落とし穴があって見事にはまったって話でした。わりとどうでもいいですね。はい。