如何在 wsgi.py 中将 'unicode string' 传递给 os.environ

How can I pass a 'unicode string' to os.environ within a wsgi.py

如果我尝试将 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

的一部分时,情况似乎并非如此

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

我试图阅读 django/wsgi/envvars 上的大部分资源,尤其是 Graham Dumpletons approach 但其中 none 似乎提到了任何编码问题。

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

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

这个答案只是对 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 and refer to mod_wsgi's documentation