2010-01-31 4 views
3

Я хочу отправить HTML-страницу в веб-браузер, закодированный как UTF-8. Однако следующий пример не удается:Как кодировать вывод WSGI в UTF-8?

from wsgiref.simple_server import make_server 

def app(environ, start_response): 
    output = "<html><body><p>Räksmörgås</p></body></html>".encode('utf-8') 
    start_response('200 OK', [ 
     ('Content-Type', 'text/html'), 
     ('Content-Length', str(len(output))), 
    ]) 
    return output 

port = 8000 
httpd = make_server('', port, app) 
print("Serving on", port) 
httpd.serve_forever() 

Вот отслеживающий:

Serving on 8000 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/wsgiref/handlers.py", line 75, in run 
    self.finish_response() 
    File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/wsgiref/handlers.py", line 116, in finish_response 
    self.write(data) 
    File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/wsgiref/handlers.py", line 202, in write 
    "write() argument must be a string or bytes" 

Если удалить кодировку и просто вернуть юникод строку Python 3, сервер wsgiref кажется закодировать в любых кодировок в браузере специфицирует в заголовке запроса. Однако я бы хотел, чтобы этот контроль был сам, поскольку я сомневаюсь, что я могу ожидать, что все серверы WSGI будут делать то же самое. Что мне делать, чтобы вернуть HTML-страницу с кодировкой UTF-8?

Спасибо!

+0

Ваш вывод должен быть юникода буквальным, так как (1) вы используете не-ASCII символов в нем и (2), кодирующей его. Вероятно, это не причина вашей текущей проблемы, но когда-нибудь она вас укусит. –

+0

Вы имеете в виду писать строку, такую ​​как u'Räksmörgås '? Мне не нужно это делать, поскольку я нахожусь на Python 3 – pthulin

ответ

5

Вы должны вернуть страницу в виде списка:

def app(environ, start_response): 
    output = "<html><body><p>Räksmörgås</p></body></html>".encode('utf-8') 
    start_response('200 OK', [ 
     ('Content-Type', 'text/html; charset=utf-8'), 
     ('Content-Length', str(len(output))) 
    ]) 

    return [output] 

WSGI разработан таким образом, чтобы вы могли просто yield HTML, (полный или по частям).

+0

Справедливо, изменил его. – AndiDog

+0

Спасибо, вернув выход в список, решил это! – pthulin

0

редактировать

vim /usr/lib/python2.7/site.py 

encoding = "ascii" # Default value set by _PyUnicode_Init() 

в

encoding = "utf-8" 

перезагрузка системы

пункт FORCAR о питон 2.7 trabalhar ком UTF-8 Como Padrão POIs о mod_wsgi Busca codificacao Padrao сделать питон дие анте эпоха ascii com no maximo 128 caracteres!

+1

Пожалуйста, подумайте о переводе последнего абзаца на английский язык, если это не слишком важно/релевантно. – Drew

0

AndiDog ответ правильный, но в какой-то среде, вы должны изменить приложение в приложение

def application(environ, start_response): 
    output = "<html><body><p>Räksmörgås</p></body></html>".encode('utf-8') 
    start_response('200 OK', [ 
     ('Content-Type', 'text/html; charset=utf-8'), 
     ('Content-Length', str(len(output))) 
    ]) 
    return [output] 
+0

Это не дает ответа на вопрос. Когда у вас будет достаточно [репутации] (https://stackoverflow.com/help/whats-reputation), вы сможете [прокомментировать любое сообщение] (https://stackoverflow.com/help/privileges/comment); вместо этого [предоставить ответы, которые не требуют разъяснений у аськи) (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- я-делать-вместо этого). – Yaron

 Смежные вопросы

  • Нет связанных вопросов^_^