使用`os.path.exists`的奇怪`UnicodeEncodeError`

exh*_*uma 14 python apache unicode flask

在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)
Run Code Online (Sandbox Code Playgroud)

请注意,我repr()在记录的错误中包含了文件名.这表明文件名作为Unicode实例传递.这么多是正确的......

如果我使用python解释器运行罪魁祸首,它按预期工作:

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

很明显,在Flask环境中运行时,Python认为它应该使用ASCII编解码器而不是UTF-8编码文件名.我使用Apache httpd后面的mod_wsgi部署了应用程序.

我想我必须告诉其中一个人在某处使用UTF-8?但是哪里?

Gra*_*ton 19

有关同一问题,请参阅Django文档.使用mod_wsgi时,应该是相同的解决方案:

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

以上链接文档的摘录:

[...]您必须确保用于启动Apache的环境配置为接受非ASCII文件名.如果未正确配置环境,则在调用类似于os.path包含非ASCII字符的文件名中的函数时,将触发UnicodeEncodeError异常.

为避免这些问题,用于启动Apache的环境应包含类似于以下内容的设置:

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'
Run Code Online (Sandbox Code Playgroud)

有关放置这些配置项的相应语法和位置,请参阅操作系统的文档; /etc/apache2/envvars是Unix平台上的常见位置.将这些语句添加到环境后,重新启动Apache.

  • 请注意:您所指的锚点似乎不再存在于该URL中.相反,我在这里找到它:https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#if-you-get-a-unicodeencodeerror (4认同)
  • 在`uwsgi.ini`中,它不能包含引号:`env = LANG = en_US.UTF-8` (3认同)