使用apache服务器时覆盖python3默认编码器

时间:2017-10-13 14:09:55

标签: python python-3.x utf-8 centos mod-wsgi

我正在运行一个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

我该如何进一步调试呢?

2 个答案:

答案 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)