UnicodeEncodeError [Python3 / Gunicorn / Nginx / Django]

时间:2017-07-05 08:29:35

标签: django python-3.x nginx utf-8 gunicorn

解决

当我按照here中的说明进行此错误。 我设置了单位文件。我明白局域网env有价值的传输不正确,它使用默认的ascii。您可以通过在单元文件中添加一行来解决此问题。找出来是一段非常漫长的旅程......

[service]
Environment="LANG=en_US.UTF-8"

当我使用 mod_wsgi和Apache2设置我的环境时没有任何问题。我只需要在/ etc / apache2 / envars路径中添加“export LANG='en_US.UTF-8' export LC_ALL='en_US.UTF-8'”以上传文件使用非ASCII文件名。

这一次,我用 Nginx和Gunicorn 设置了我的环境。但是在显示非ASCII字符的每个部分都会出现UnicodeEncoderError。

'ascii' codec can't encode characters in position 57-59: ordinal not in range(128)

我不明白为什么'ascii'编解码器用于在Python3和Django环境中进行编码。

我搜索并搜索和搜索。我检查并尝试如下。

  1. PostgreSQL检查:编码UTF8
  2. Django默认编码:utf-8
  3. Ubuntu区域设置检查:en_US.UTF-8(我也试过'ko_KR.UTF-8',因为它有韩文错误)
  4. checked python 3 sys.getdefaultencoding,sys.stdout.encoding,sys.stdin.encoding:utf-8
  5. 添加charset utf-8;在/ etc / nginx / sites-available / myproject
  6. 检查Gunicorn是否调用python2而不是python3:使用pip3 virtualenv安装gunicorn并在gunicorn文件中检查“#!/home/username/venv/bin/python3”。
  7. 在views.py中写入import sys reload(sys)sys.setdefaultencoding('utf-8'):我知道它可以应用于python2并且不推荐使用它。
  8. 我怀疑Gunicorn调用python2而不是python3,因为python2也安装在我的Ubuntu中。如果我检查python -c 'import sys; print(sys.getdefaultencoding());',我可以看到'ascii'。 Python 2有str和unicode。我的结论是Gunicorn最后没有问题。

    我仍然怀疑在Ubuntu16.04中预装的python 2.7。你能解释一下我的遗失或误解吗?我知道ascii编解码器编码错误可能发生在Python2上,而不是Python3。

    的Env Python 3.5 Django 1.11.1 Gunicorn 19.7.1 Nginx 1.10.3 Ubuntu 16.04 LTS

1 个答案:

答案 0 :(得分:0)

对于那些使用gunicorn进行编码但没有将其用作守护程序的人(例如,如果您在docker中运行gunicorn,则只需启动命令),因此,不要使用此配置文件:

我正在使用openpyxl库生成电子表格,并且在我已使用gunicorn对服务进行服务化的服务器中对其进行测试时遇到此错误。在确认所有其他编码要求都很好(python,系统区域设置等)后,很明显问题出在枪械问题上。 该应用程序中的其他所有内容都可以正常运行,只有电子表格导出才能抛出该错误。

我本来想用其他东西代替gunicorn,但是后来我意识到问题出在文件名上,而不是生成文件内容的过程上。

我将生成的文件命名为“exportació”,而只是将其替换为“ exportacio”,就使它像一种魅力一样工作。

考虑到我确实不需要文件名中的非ASCII字符,这对我来说已经足够了。