web

У меня программа не работает!!!

И в ru_python не принимают...

Может кто-нибудь умный мимопроходящий подскажет?


Дано:
Python 3
Apache 2
mod_wsgi
Windows
Задача:
Сделать возможным использовать в строках русские буквы.

AddDefaultCharset UTF-8 в конфиге Апача стоит.
# coding: utf-8 в скрипте - тоже.
Аналогичный консольный скрипт запускается успешно. А апач ругается на non-latin characters.
[Fri Apr 16 15:46:08 2010] [error] [client 127.0.0.1] TypeError: sequence of byte string values expected, value containing non 'latin-1' characters found\r
Update В общем, ларчик просто открывался. Этот mod_wsgi работает с функцией application, от которой он ждет последовательности байт. Так что просто применение .encode('utf-8') к возвращаемой строке спасает.

Метки: ,
Что мы видим: Мы видим явно питоновский эксепшн, произошедший внутри скрипта.

Кто-то там в этом скрипте ожидал что ему передадут байты, а ему передали юникодную строку. Это немножко другая логическая сущность. В строке байтов не может быть элементов с кодами больше 255. А если нам нужно строку символов с русскими буквами представить в виде байтиков в кодировке utf-8, то каждая русская буква будет занимать два байта.

То есть где-то в там нужно перед передачей этому кому-то эту строчку сериализвать в utf-8. Чтобы он получил не последовательность символов, а уже готовые байтики.

У тебя там строчкой выше не написано, где именно этот TypeError возникает?
[Fri Apr 16 15:46:08 2010] [error] [client 127.0.0.1] mod_wsgi (pid=1124): Exception occurred processing WSGI script 'D:/Work/site/Fable/Aelfrica/index.wsgi'.

Без подробностей.
По факту - просто при попытке присвоить переменной строку с русскими буквами. Или считать такую строку из файла.
Ничего ты ему не объяснишь, mod_wsgi не для этого. Внимание: дальнейшее -- чистая теория, практики на эту тему у меня нет. Но я недавно прочитал спецификации wsgi, и там прямым текстом сказано, что все передаваемые туда строки -- это всегда строки байт. И даже если вы пользуетесь питоном, где "строка" по умолчанию юникодная (Python 3.x, jython, IronPython), то всё равно вы должны составлять эти строки из символов с кодами меньше 256. А интерпретация их как utf-8, или latin-1, или cp1251 будет делаться уже потом. А ещё там сказано, что wsgi -- это низкоуровневый интерфейс, и предназначен не для прикладного программирования, а как общая база для более умных фреймворков, которые по идее такие детали от пользователя спрячут. Ну то есть при желании вы можете, но тогда всё это придётся руками делать.

... Эх, эльфы, дураки вы, эльфы ...

Опыт показал, что ломалось оно всё-таки скорее уже при передаче. Оно хочет, чтобы application возвращало последовательность байтов. Так что простое encode('utf-8') таки спасает.
Спасибо!
Ну да, я это и пытался сказать, но криво и многословно. Последовательность байтов, а если по каким-то причинам тип данных у тебя "юникодная строка", то в неё всё равно нужно искусственно упихать последовательность байтов. Но, к счастью, тебе это не нужно.

... Своп на рамдрайве ...