LINUX.ORG.RU

python3 / cgi / utf-8


0

2

исходник в utf-8
в нем кириллица
при запуске шлется хидер что контент в utf-8

запускаю апач, он как cgi обрабатывает питон-скрипт
и получаю:

File «/home/python3/www/engine/as_base.py», line 57, in log
print('[%s] %s' % (type, text))
UnicodeEncodeError: 'ascii' codec can't encode character '\u0432' in position 3: ordinal not in range(128)

пробовал text.encode('utf-8', 'ignore')

получается на экране:

[] b'\xd0\xb2 res/proxy.txt 0 \xd0\xbf\xd1\x80\xd0\xbe\xd0\xba\xd1\x81\xd0\xb8'

что можно сделать, чтобы вывел кириллицу?

я бы попробовал:

print(str(text))
shty ★★★★★
()
Ответ на: комментарий от shty

только что это читал, но ничего не помогает

import sys
import codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)

получаем:

line 19, in print('\u0433\u0430\u0432\u043d\u043e') File «/usr/local/lib/python3.2/codecs.py», line 356, in write self.stream.write(data) TypeError: must be str, not bytes

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

а если

print(str('\u0433\u0430\u0432\u043d\u043e'))

shty ★★★★★
()
Ответ на: комментарий от sergey-novikov

сейчас погуглил, говорят что правильно писать:

out = codecs.getwriter('utf-8')(sys.stdout.buffer)

к сожалению, по рукой нет PYTHON3, поэтому могу только подгугливать :), но Вы теперь знаете проблему и, уверен, сможете её разрулить

большая просьба отписаться по результатам, а то вдруг придётся на такие же грабли наступать

shty ★★★★★
()
Ответ на: комментарий от shty

ага, проблема ясна
спасибо большое

чуть позже снова ей займусь, а когда решу - отпишусь здесь

могу ещё инфы тут выложить по запуску питона3 как cgi, там есть некоторые нюансы

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

могу ещё инфы тут выложить по запуску питона3 как cgi, там есть некоторые нюансы

было бы интересно

shty ★★★★★
()

Попробуй

% cat > /usr/lib/pythonX/site-packages/sitecustomize.py import sys sys.setdefaultencoding('utf8') ^D

anonymous
()
Ответ на: комментарий от anonymous

согласно той темы надо делать так:

output = lambda msg: (sys.stdout.buffer.write(b'Content-type: text/html;charset=utf-8\n\n'),
sys.stdout.buffer.write(msg))

output('лажа'.encode('utf-8'))


при этом выводится «лажа», а за ней строка Content-type... - и так на каждый вызов output

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

в общем, рабочий пример запуска python3 как CGI в апач 2.2 с кириллицей в браузере вот:

#!/usr/local/bin/python3
import sys, os
os.dup2(1, 2) # copy stderr->stdout
sys.stdout.buffer.write(b'Content-type: text/html;charset=utf-8\n\n')

def out(msg):
sys.stdout.buffer.write(msg.encode('utf8'))
sys.stdout.flush()

# test
import time
for i in range(10):
out('кириллица<br />')
time.sleep(1)

файл сохраняем в utf-8
в браузере тоже должна быть выбрана эта кодировка
все ошибки копируются в stdout, т.е. в браузер


подключение в httpd.conf:
- создаем вирт. хост, добавляем хэндлер
- в директории со скриптами добавляем +ExecCGI
- ставим на скрипт права на выполнение: chmod +x script.py

<VirtualHost localhost:80>
ServerAdmin admin@localhost2
DocumentRoot /home/python3/www
ServerName pyweb
ErrorLog logs/pyweb_errors
CustomLog logs/pyweb_custom common

AddHandler cgi-script .cgi .py .pyw # важно
</VirtualHost>

<Directory «/home/python3/www»>
DirectoryIndex start.pyw
Options +ExecCGI # важно
</Directory>

вроде бы больше ничего не требуется

sergey-novikov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.