解决uWSGI的编码问题详解
发现问题
最近工作中遇到一个问题,在把Flask写的应用通过Supervisor+uWSGI部署到正式服务器上时,出现了这样的错误:
Unabletoprintthemessageandarguments–possibleformattingerror.
或者
UnicodeEncodeError:‘ascii'codeccan'tencodecharactersinposition24-25:ordinalnotinrange(128)
有趣的是,直接在Python环境下运行的时候,没有这样的错误。使用uwsgiuwsgi.ini这种方式来运行也正常。
由于对unicode的支持不够完善,这种报错经常会出现在Python2中,但我的所有程序都在Python3中写成,不应该再出现这样的错误。况且,所有的python文件都在首行设定了编码:
#-*-coding:utf-8-*-
我的环境如下:
- Ubuntu16.04.1LTS
- Python3.5.2
- uWSGI2.0.14(inpython3pip)
- Supervisor3.3.1(inpython2pip)
uwsgi.ini配置文件内容如下:
[uwsgi] master=true wsgi-file=manage.py callable=app processes=2 threads=2 max-requests=6000 chmod-socket=664 uid=app gid=app buffer-size=32768 venv={project_dir}/venv ;http=127.0.0.1:5001 logto={project_dir}/logs/uwsgi.log
由于直接使用Python和uwsgi都不会出现这样的错误,因此可以判断应该是环境编码设置导致的问题。
查看服务器的编码如下:
%locale LANG=C LANGUAGE=C: LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=en_US.UTF-8
发现LANG和LANGUAGE环境变量并没有设置。
可以在uwsgi.ini中设定这两个环境变量的值。经过测试,发现实际起作用的是LANGUAGE。
envLANG="en_US.UTF-8" envLANGUAGE="en_US.UTF-8"
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。