TurboGearsバージョンアップしたら動かない-3
2009年3月8日 (日)
このブログの2月16日記事TurboGearsバージョンアップしたら動かないと、2月22日の記事TurboGearsバージョンアップしたら動かない-2で書いたとおり、TurboGearsを1.0.8にバージョンアップした際に様々な問題が発生した。今日はその続編。
ちょっとしたWEBアプリをTurboGearsで作ることにした。少しは違うことをしたくなり、ビューテンプレートをCheetahにしてみた。標準のテンプレートはKidだが柔軟性に欠けるのと重いことがマイナス要因となり、速いと評判のCheetahにした。TurboGearsは少し前のバージョンからCheetahも使えるようになっている。なお次期バージョンではGenshiがデフォルトとなりCheetahはサポートされないようだが、Genshiは少々難しそうなのでとりあえずは使ったことの無いCheetahにした。
考え方の若干の違いはあるが様々なテンプレートエンジンを使用したことのある私にはそれほど大きな問題ではなく、とりあえずのテスト表示は上手く行った。ところが、プログラム中から与えた日本語文字が表示できない。表示できないのではなく、実行時エラーで止まってしまうのだ。次のようなメッセージが表示される。
File “c:\progra~1\python25\lib\site-packages\Cheetah-2.0.1-py2.5-win32.egg\Cheetah\DummyTransaction.py”, line 32,
in getvalue return ‘’.join(outputChunks)
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe3 in position 428: ordinal not in range(128)
良くある日本語文字コードの問題だ。そこで思い当たる箇所をチェックしてみたが問題はない。私のプログラムは文字列は原則としてUNICODEベースでプログラミングしている。問題の文字列をUTF-8文字列にしたところ、上手く行った。ビューはUTF-8なので与える文字列は同じUTF-8にしなければならない、ということか。
いや、それは困る。いままでKidではUNICODE文字列を直接与えても問題なく表示できていた。テンプレートをCheetahに変えるとプログラミングを変更しなければならないのでは話にならない。ちなみにTurboGearsの設計では本体のプログラムミング変更無しでテンプレートだけ変えれば良いはずなのだ。
エラーメッセージを良く見ると、CheetahのDummyTransaction.py という箇所でエラーが発生している。”DummyTransaction”とは、なにやら本質的ではない処理のようだ。その本質的でない箇所のエラーでCheetahが使えないのでは癪に障るので、DummyTransaction.pyの問題の箇所を修正した。
修正前:
def getvalue(outputChunks=outputChunks): return ''.join(outputChunks)
修正後:
import types ... def getvalue(outputChunks=outputChunks): strJoin = "" for chunk in outputChunks: if isinstance(chunk,types.UnicodeType): chunk = chunk.encode('utf-8','ignore') strJoin = strJoin + chunk return strJoin
これで問題なく動くようになった。
コメント・トラックバック一覧(0)
この記事にはまだコメントがついていません。