您好,欢迎来到沓楚财经网。
搜索
您的当前位置:首页详解uWSGI的编码问题解决方法

详解uWSGI的编码问题解决方法

来源:沓楚财经网


最近在用Flask 写的应用通过 Supervisor+uWSGI 部署到正式服务器上时出现了错误,通过查找相关的资料终于解决了,所以想着分享出来给大家,下面这篇文章主要介绍了解决uWSGI的编码问题的相关资料,需要的朋友可以参考下。

发现问题

最近工作中遇到一个问题,在把 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 = 6
    
    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"

    Copyright © 2019- tachun.com.cn 版权所有

    违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

    本站由北京市万商天勤律师事务所王兴未律师提供法律服务