Python 即使在设置了LANG和LC_ALL之后,在mod_wsgi中运行UnicodeEncodeError

Python 即使在设置了LANG和LC_ALL之后,在mod_wsgi中运行UnicodeEncodeError,python,unicode,utf-8,flask,Python,Unicode,Utf 8,Flask,从我的应用程序打印unicode字符串时,我遇到了一个unicode错误。它通过AWS上的Elastic Beanstalk(Apache+mod_wsgi)运行。我发现这很有用,当我调用locale.getdefaultlocale()和locale.getPreferredEncode()时,我得到None和ASCII 我将LANG和LC_ALL设置为en_US.UTF-8(通过WSGIDaemonProcess指令和环境变量)。现在,当我调用locale.getdefaultlocale(

从我的应用程序打印unicode字符串时,我遇到了一个
unicode错误。它通过AWS上的Elastic Beanstalk(Apache+mod_wsgi)运行。我发现这很有用,当我调用
locale.getdefaultlocale()
locale.getPreferredEncode()
时,我得到
None
ASCII

我将
LANG
LC_ALL
设置为
en_US.UTF-8
(通过WSGIDaemonProcess指令和环境变量)。现在,当我调用
locale.getdefaultlocale()
locale.getPreferredEncode()
时,我得到
('en_US','UTF-8')
UTF-8
。但是,我仍然得到相同的
unicodeincodeerror

sys.stdout
的类型为
mod\wsgi.Log
。我找不到有关如何检查/设置此文件编码的任何详细信息

我不确定此时如何继续调试。如何修复此错误

此wsgi.conf是Elastic Beanstalk的默认值,但我在WSGIDaemonProcess指令中添加了
lang
locale

LoadModule wsgi\u module modules/mod\u wsgi.so
WSGIPythonHome/opt/python/run/baselinenv
WSGISocketPrefix运行/wsgi
WSGirestricton嵌入式
别名/static//opt/python/current/app/static/
命令允许,拒绝
通融
WSGIScriptAlias//opt/python/current/app/application.py
要求所有授权
WSGIDaemonProcess wsgi processes=1 threads=15 lang='en_US.UTF-8'locale='en_US.UTF-8'显示名称=%{GROUP}python路径=/opt/python/current/app:/opt/python/run/venv/lib/python2.7/site-packages user=wsgi GROUP=wsgi home=/opt/python/current/app
WSGIProcessGroup wsgi
回溯:

ERROR:discotech:Exception on /venues [GET]
Traceback (most recent call last):
  File "/opt/python/run/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/opt/python/run/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/opt/python/run/venv/lib/python2.7/site-packages/flask_cors/extension.py", line 110, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/opt/python/run/venv/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/opt/python/run/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/opt/python/run/venv/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/opt/python/current/app/discotech/api/venue.py", line 32, in get_venues
    print "TEST = %s", test
UnicodeEncodeError: 'ascii' codec can't encode character u'\\xe1' in position 1: ordinal not in range(128)
下面是我用来练习它的代码:

# -*- coding: utf-8 -*-

...

@api_app.route('/venues')
def get_venues():
    test = u"Ián"
    print "TEST =", test

我听从@kchomski的建议,编辑了
/etc/apache2/envvars

## Uncomment the following line to use the system default locale instead:
. /etc/default/locale

最后一行被注释了,我取消了注释。现在我的WSGI脚本正在使用
en_US.UTF-8
locale,一切正常

打印字符串时,不能手动调用
.encode('utf-8')
?当然可以,但这不是正确的解决方案。打印东西时,我不必担心输出编码。这应该由环境/输出流来处理。您可以展示一下如何通过WSGIDaemonProcess指令来设置它,以及您在Apache配置中为mod_wsgi提供了什么吗?您必须确保您实际上是在委托应用程序在守护进程中运行,否则您为WSGIDaemonProcess设置的内容将毫无意义。您不应该在WSGI脚本文件中手动设置环境变量,因为这不是必需的,并且可能会混淆查看WSGIDaemonProcess是否正常工作的能力。请注意,AWS使用旧的mod_wsgi版本。在mod_wsgi的最新版本中有与此相关的修复。谢谢。我用wsgi.conf编辑了我的文章。我将在不设置env变量的情况下重试,但大多数设置都是样板弹性Beanstalk,因此我不知道应用程序如何在守护进程之外运行。也许我应该尝试更新mod_wsgi?您是否将
导出LANG='en_US.UTF-8'
导出LC\u ALL='en_US.UTF-8'
放在
/etc/apache2/envvars
中?这为我解决了问题。@Cluster我一生中做过好几次,然后才找到解决问题的方法。顺便说一句,如果你觉得答案有用,你可以投票给它:)