Как мне кодировать вывод WSGI в UTF-8? - PullRequest
4 голосов
/ 01 февраля 2010

Я хочу отправить HTML-страницу в веб-браузер в кодировке 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?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 01 февраля 2010

Вам необходимо вернуть страницу в виде списка:

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 голосов
/ 11 января 2018

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 голосов
/ 19 декабря 2013

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

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

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

до

encoding = "utf-8"

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

para for o Python 2.7 trabalhar com utf-8 como padrão pois o mod_wsgi busca codificacao padrao do python que antes эра ascii com нет максимум 128 символов!

...