【问题标题】:overwrite python3 default encoder when using apache server使用 apache 服务器时覆盖 python3 默认编码器
【发布时间】:2018-03-25 16:54:13
【问题描述】:

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

如何进一步调试?

【问题讨论】:

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


    【解决方案1】:

    阅读:

    这解释了有关语言/语言环境的问题。

    你没有使用 mod_wsgi 守护模式,但你应该使用守护模式是推荐的方法。

    还可以阅读 mod_wsgi 文档:

    【讨论】:

    • 感谢您的回复。恐怕我无法控制这个项目的 devops 部分。但感谢有关 mod_wsgi 守护进程的提示
    【解决方案2】:

    Python3 在文本模式下打开文件时使用local.getpreferredencoding 返回的编码作为编码。我建议添加一些日志记录并记录默认编码值,以检查是否是未正确配置的环境。

    可能是代码中某处存在硬编码的编码参数。可以显示错误的stacktrace和对应的代码吗?

    根据部署机制,可能是 SetEnv 配置未传递给 Python。有关 mod_wsgi 部署,请参阅 http://ericplumb.com/blog/passing-apache-environment-variables-to-django-via-mod_wsgi.html

    与该博客文章中的描述类似,您必须修改 inginious-webapp.production 文件以手动获取和设置环境变量。对于某些变量,这已经在默认的inginious-webapp 中完成。在这里您必须特别添加 PYTHONIOENCODING

    如果您在 mod_wsgi 守护程序模式下运行,这可能会对 http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html 有所帮助,尤其是 lang 或 locale 参数。

    【讨论】:

    • locale.getpreferredencoding() 更改后为 'ANSI_X3.4-1968' 。更新了问题。硬编码值 - 我怀疑它,因为它在我的本地机器上运行良好
    • 显然 env 设置不适合 Python 的上下文。你用的是什么部署方式,mod_wsgi?
    • 我怎么知道?哪个部署?
    • 好吧,因为 locale.getpreferredencoding 不返回 utf-8 ;) 部署是 Apache 调用 Python 应用程序的方式,有几种机制,CGI、WSGI、守护模式下的 WSGI、fastcgi....我正在用一些提示更新答案。
    • 嗨,我已经用我的 /etc/httpd/conf/httpd.conf 文件的内容更新了这个问题。无论我是在运行 WSGI 还是 WSGI 守护进程,我都不知道如何实现。
    猜你喜欢
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2014-12-19
    • 2016-03-24
    • 2017-09-10
    • 1970-01-01
    • 2014-04-09
    相关资源
    最近更新 更多