我正在运行一个apache服务器,它服务于一个名为ingenious
的框架在阅读带有希伯来语字符的文件时获取UnicodeDecodeError('ascii'
。
我已经读过您可以使用环境变量更改python3的默认首选编码。
所以我使用[setenv] [3]方法编辑了/etc/httpd/conf/httpd.conf
:
SetEnv LC_ALL en_US.UTF-8
SetEnv LANG en_US.UTF-8
SetEnv LANGUAGE en_US.UTF-8
SetEnv PYTHONIOENCODING utf8
使用sudo service httpd restart
重新启动服务器但仍无法正常工作。
我必须说明,当软件没有运行apache服务器时,软件就在本地运行,只需要python3。
更改后 locale.getpreferredencoding()
为ANSI_X3.4-1968
这是/etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin me@domain.com
<Directory />
AllowOverride none
Require all denied
</Directory>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<IfModule mime_module>
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile On
# Supplemental configuration
LoadModule wsgi_module /usr/lib64/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so
WSGIScriptAlias / "/usr/bin/inginious-webapp.production"
WSGIScriptReloading On
Alias /static/common /usr/lib/python3.5/site-packages/inginious/frontend/common/static/
Alias /static/webapp /usr/lib/python3.5/site-packages/inginious/frontend/webapp/static/
Alias /static/lti /usr/lib/python3.5/site-packages/inginious/frontend/lti/static/
SetEnv LC_ALL en_US.UTF-8
SetEnv LANG en_US.UTF-8
SetEnv LANGUAGE en_US.UTF-8
SetEnv PYTHONIOENCODING utf8
<Directory "/usr/bin">
<Files "inginious-webapp.production">
Require all granted
</Files>
</Directory>
<DirectoryMatch "/usr/lib/python3.5/site-packages/inginious/frontend/(.+)/static/">
Require all granted
</DirectoryMatch>
IncludeOptional conf.d/*.conf
我该如何进一步调试呢?
答案 0 :(得分:1)
在文本模式下打开文件时,Python3使用local.getpreferredencoding
返回的编码作为编码。我建议添加一些日志记录并记录默认编码值,以检查它是否是未正确配置的环境。
可能是代码中的某个地方存在硬编码编码参数。你能显示错误的堆栈跟踪和相应的代码吗?
根据部署机制,可能是SetEnv配置未传递给Python。有关mod_wsgi部署,请参阅http://ericplumb.com/blog/passing-apache-environment-variables-to-django-via-mod_wsgi.html。
与该博客文章中描述的内容类似,您必须修改 inginious-webapp.production 文件以手动获取和设置env vars。对于某些变量,这已在默认inginious-webapp中完成。在这里你必须特别添加 PYTHONIOENCODING 。
如果你在mod_wsgi deamon模式下运行,这可能有助于http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html,特别是lang或locale参数。
答案 1 :(得分:1)
读:
这解释了lang / locale的问题。
您没有使用mod_wsgi守护程序模式,但您应该以守护进程模式为推荐方法。
另请阅读mod_wsgi文档: