Djangoで日本語名のファイルアップロード時にエラー

ひさびさにUnicodeEncodeErrorなんてものを見た気がする。

UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-19: ordinal not in range(128)


以前も同じようなことがあって、そのときはgunicornを起動している環境の環境変数でLC_TYPE=ja_JP.UTF-8が指定すれば解決した。

関連:djangoで日本語名のファイルアップロード時のエラー - brainstorm

今回も同じかと思って環境変数を確認したらLC_TYPEはちゃんと設定されていた。

$ env  | grep ja_JP.UTF-8
LC_ALL=ja_JP.UTF-8
LANG=ja_JP.UTF-8
LANGUAGE=ja_JP.UTF-8
LC_CTYPE=ja_JP.UTF-8

で調べた結果、gunicornをUpstartで起動させる場合、Upstartの設定ファイル中でexport LC_ALL=ja_JP.UTF-8しておく必要があるらしい。

適当なサンプル

description "my website"
start on runlevel [2345]
stop on runlevel [06]
respawn

script
         # 省略
         export LC_ALL=ja-JP.UTF-8   # <- 追加
         exec gunicorn ....... 
         # 省略
end script

上記のように設定ファイルを修正後、initctl restartではなく、stop/startをすると問題は解決した。