14

Web アプリケーション (Flask を使用) で、次のエラーが発生します。

Unable to retrieve the thumbnail for u'/var/data/uploads/2012/03/22/12 Gerd\xb4s Banjo Trio 1024.jpg'
Traceback (most recent call last):
 File "/var/www/beta/env/lib/python2.7/site-packages/dblib-1.0dev3-py2.7.egg/dblib/orm/file.py", line 169, in get_thumbnail
   if not exists(filename):
 File "/usr/lib/python2.7/genericpath.py", line 18, in exists
   os.stat(path)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb4' in position 52: ordinal not in range(128)

repr()ログに記録されたエラーにファイル名の が含まれていることに注意してください。これは、ファイル名が Unicode インスタンスとして渡されることを示しています。そんなに正しい...

Python インタープリターを使用して犯人を実行すると、期待どおりに動作します。

>>> from os.path import exists
>>> exists(u'/var/data/uploads/2012/03/22/12 Gerd\xb4s Banjo Trio 1024.jpg')
True

明らかに、Flask 環境で実行している間、Python は、UTF-8 ではなく ASCII コーデックを使用してファイル名をエンコードする必要があると考えています。Apache httpd の背後で mod_wsgi を使用してアプリケーションをデプロイしました。

どちらか一方に UTF-8 を使用するように指示する必要があると思いますか? しかしここで?

4

1 に答える 1

20

同じ問題については、Django のドキュメントを参照してください。mod_wsgi を使用する場合は、同じソリューションである必要があります。

https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#if-you-get-a-unicodeencodeerror

上記のリンクされたドキュメントからの抜粋:

[...] Apache の起動に使用される環境が、ASCII 以外のファイル名を受け入れるように構成されていることを確認する必要があります。環境が正しく構成されていない場合、os.pathASCII 以外の文字を含むファイル名に対して のような関数を呼び出すと、UnicodeEncodeError 例外がトリガーされます。

これらの問題を回避するには、Apache の起動に使用する環境に、次のような設定を含める必要があります。

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'

これらの構成項目を配置するための適切な構文と場所については、オペレーティング システムのドキュメントを参照してください。 /etc/apache2/envvarsUnix プラットフォームでは一般的な場所です。これらのステートメントを環境に追加したら、Apache を再起動します。

于 2012-05-01T10:22:41.840 に答える