Python3 + uwsgi - специальные языковые символы в терминале - PullRequest
0 голосов
/ 24 сентября 2018

Я думаю, что эта тема обсуждалась несколько раз, но для меня все еще неясно.Во-первых, я начинаю с используемой ОС: я работаю на удаленной оболочке, на Ubuntu 16.04 LTS./ etc / default / locale ниже:

#  File generated by update-locale
LANG=en_US.UTF-8
#LANG=pl_PL.UTF-8
#LANGUAGE=POSIX

У меня есть некоторый файл py: test4.py

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

import sys

va =  sys.getfilesystemencoding()
print('File system encoding')
print(va)

vb = sys.getdefaultencoding()
print('Default encoding')
print(vb)

dict = {'foo' : 'bar',
        'cebula' : 'łąśćźżęó'
        }

for key, value in dict.items():
        print(key + ' : ' + value)

, когда я пытаюсь вызвать этот файл:

File system encoding
ascii
Default encoding
utf-8
foo : bar
Traceback (most recent call last):
File "test/test4.py", line 18, in <module>
print(key + ' : ' + value)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 9-16: ordinal not in range(128)

Если перед вызовом скрипта я использую:

export PYTHONIOENCODING=UTF-8

, а затем запускаю скрипт:

File system encoding
ascii
Default encoding
utf-8
cebula : łąśćźżęó
foo : bar

Все работает хорошо.

Итак, я собираюсь запустить приложение Django с использованием uwsgi (не важно, запускаю я его в virtualenv или нет).В * .ini файле (config) у меня есть блок:

env = PYTHONIOENCODING=UTF-8

Код скрипта (вырезано, только для показа происходящего):

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

def command(request):

    if request.method == 'POST':
        for key, value in sorted(request.POST.items()):
            print(key + ' : ' + value)

Если значение имеет буквы для конкретного языка (в данном случае - польского):

print(key + ' : ' + value)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-12: ordinal not in range(128)

Если я добавлю к uwsgi.ini следующие строки:

env = LC_ALL=pl_PL.UTF-8 ИЛИenv = LANG=pl_PL.utf-8

Приложение работает стабильно.

Вопросы:

a) Почему Python3 не нужно устанавливать эти локали, даже временные, но uwsgi нужны для их анализаправильно символы, специфичные для языка?

b) Какую функцию / метод следует использовать, когда я знаю, что переменные печати будут отображаться в терминале (как указано выше), и они будут содержать символы, специфичные для языка.Я хочу остаться с кодировкой en_US.UTF-8.

...