Вы не должны читать свои потоки ввода-вывода как строки для CGI / WSGI;они не являются строками Unicode, это явно байтовые последовательности.
(Учтите, что Content-Length
измеряется в байтах, а не в символах; представьте, что вы пытаетесь прочитать отправку multipart/form-data
загрузки двоичного файла, сжатую в UTF-8-декодированные строки или возврат двоичного файла, загруженного ...)
Так что вместо этого используйте sys.stdin.buffer
и sys.stdout.buffer
, чтобы получить необработанные байтовые потоки для stdio и читать / записывать двоичный файл вместе с ними.Слой чтения форм может преобразовывать эти байты в строковые параметры Юникода, где это уместно, используя любую кодировку, имеющуюся на вашей веб-странице.
К сожалению, интерфейсы стандартной библиотеки CGI и WSGI не получают этого права в Python 3.1: соответствующие модули были грубо преобразованы из оригиналов Python 2 с использованием 2to3
, и поэтому в UnicodeError есть ряд ошибок, которые могут закончиться.
Первая версия Python 3, которая может использоваться для веб-приложений, - это3.2.Использование 3.0 / 3.1 - пустая трата времени.Требовалось много времени, чтобы разобраться с этим, и PEP3333 прошел.