Pergunta

Quero enviar uma página HTML para o navegador da Web codificado como UTF-8. No entanto, o exemplo a seguir falha:

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()

Aqui está o Traceback:

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"

Se eu remover a codificação e simplesmente devolver a sequência do Unicode Python 3, o servidor WSGiref parece codificar em qualquer charset que o navegador especifique no cabeçalho da solicitação. No entanto, eu gostaria de ter esse controle, pois duvido que possa esperar que todos os servidores WSGI façam o mesmo. O que devo fazer para retornar uma página HTML codificada UTF-8?

Obrigado!

Foi útil?

Solução

Você precisa devolver a página como uma lista:

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 foi projetado dessa maneira para que você pudesse simplesmente yield o HTML (completo ou em partes).

Outras dicas

editar

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

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

para

encoding = "utf-8"

reiniciar sistema

para forcar o python 2.7 A Trabalhar com utf-8 como Padrão Pois o Mod_wsgi Busca A Codificacao Padrao do Python Que Antes ASCII COM no Maximo 128 Caracteres!

A resposta do AndIDOG está correta, mas em algum ambiente você precisa transformar o aplicativo no aplicativo

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]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top