【问题标题】:How can I pass a 'unicode string' to os.environ within a wsgi.py如何在 wsgi.py 中将“unicode 字符串”传递给 os.environ
【发布时间】:2017-01-23 22:59:31
【问题描述】:
  • apache2
  • wsgi
  • 虚拟主机
  • python3

如果我尝试将 envvars 设置为 wsgi.py 的一部分,如果值包含非 ascii 字符,我会遇到问题。

Traceback (most recent call last):
File "/home/vagrant/pyvenv/lib/python3.5/site-packages/absys/config/wsgi.py", line 13, in <module>
os.environ['DJANGO_TESTVAR'] = 'M\xc3\xb6\xc3\xb6\xc3\xb6\xc3\xb6'
File "/usr/lib/python3.5/os.py", line 730, in __setitem__
value = self.encodevalue(value)
File "/usr/lib/python3.5/os.py", line 799, in encode
return value.encode(encoding, 'surrogateescape')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-4: ordinal not in range(128)

当我尝试以普通用户或 root 用户身份执行相同操作时,它可以完美运行。这似乎是因为 os.environ 确实接受传递的 unicode 值 ('Müüü') 并且 not 尝试对其进行编码。 出于某种不理解的原因,当作为wsgi.py 的一部分运行时,似乎并非如此。

我一度认为this question 可以提供答案,但在/etc/apache2/envvars 中设置LANG = de_DE.UTF-8 并没有改变任何事情。

我尝试阅读 django/wsgi/envvars 上的大部分资源,尤其是 Graham Dumpletons approach 但他们似乎都没有提到任何编码问题。

我想,我的问题(由我目前的理解决定)归结为: "什么支配os.environs 编码行为以及如何在 wsgi 进程中影响它?

如果我可以提供任何其他信息来帮助找到答案,请告诉我。

【问题讨论】:

标签: apache environment-variables mod-wsgi python-3.5 django-wsgi


【解决方案1】:

这个答案只是对 Graham Dumpleton 最有帮助的评论的重申。所有功劳都是他的。

这个问题很可能是 wsgi-processes 环境中的 locale 设置混乱造成的。

如果您的 mod_wsgi 作为其自己的专用守护程序运行(很可能应该如此),您可以直接将所需的语言环境传递给它,从而避免由于您的发行版如何处理 apaches 环境而导致的任何问题。

为此,这些方面的东西应该可以解决问题: WSGIDaemonProcess my-django-site lang='en_US.UTF-8' locale='en_US.UTF-8'.

如需更详细的解释,请阅读 Grahams excellent blog post 并参考 mod_wsgidocumentation

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 2015-02-12
    • 1970-01-01
    • 2018-09-02
    • 2015-03-03
    • 2018-12-27
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多