解决uWSGI的编码问题详解


Posted in Python onMarch 24, 2017

发现问题

最近工作中遇到一个问题,在把 Flask 写的应用通过 Supervisor+uWSGI 部署到正式服务器上时,出现了这样的错误:

Unable to print the message and arguments ? possible formatting error.

或者

UnicodeEncodeError: ‘ascii' codec can't encode characters in position 24-25: ordinal not in range(128)

有趣的是,直接在 Python 环境下运行的时候,没有这样的错误。使用 uwsgi uwsgi.ini 这种方式来运行也正常。

由于对 unicode 的支持不够完善,这种报错经常会出现在 Python2 中,但我的所有程序都在 Python3 中写成,不应该再出现这样的错误。况且,所有的 python 文件都在首行设定了编码:

# -*- coding: utf-8 -*-

我的环境如下:

  • Ubuntu 16.04.1 LTS
  • Python 3.5.2
  • uWSGI 2.0.14 (in python3 pip)
  • Supervisor 3.3.1 (in python2 pip)

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 。

env LANG="en_US.UTF-8"
env LANGUAGE="en_US.UTF-8"

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python中的高级函数map/reduce使用实例
Apr 13 Python
Python with用法实例
Apr 14 Python
在Django的通用视图中处理Context的方法
Jul 21 Python
python编写弹球游戏的实现代码
Mar 12 Python
使用Python和xlwt向Excel文件中写入中文的实例
Apr 21 Python
python实现简单淘宝秒杀功能
May 03 Python
使用python socket分发大文件的实现方法
Jul 08 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
May 22 Python
python 如何将office文件转换为PDF
Sep 22 Python
解决Pymongo insert时会自动添加_id的问题
Dec 05 Python
Python中动态创建类实例的方法
Mar 24 #Python
python3中set(集合)的语法总结分享
Mar 24 #Python
Python Socket编程详细介绍
Mar 23 #Python
python3中int(整型)的使用教程
Mar 23 #Python
python利用Guetzli批量压缩图片
Mar 23 #Python
python3中str(字符串)的使用教程
Mar 23 #Python
python常用知识梳理(必看篇)
Mar 23 #Python
You might like
从手册去理解分析PHP session机制
2011/07/17 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
jQuery EasyUI API 中文文档 DateTimeBox日期时间框
2011/10/16 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
Javascript基础教程之数据类型 (字符串 String)
2015/01/18 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
JS使用cookie实现只出现一次的广告代码效果
2017/04/22 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
秋季运动会表扬稿
2014/01/16 职场文书
门诊手术室工作制度
2014/01/30 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
查摆问题整改措施
2014/10/24 职场文书
民间借贷被告代理词
2015/05/23 职场文书
通讯稿范文
2015/07/22 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python