CherryPy неправильно обрабатывает символы не ASCII в шаблонах Jinja2 - PullRequest
2 голосов
/ 06 февраля 2011

Я пытаюсь запустить сайт, используя Python 2.7.1, Jinja 2.5.2 и CherryPy 3.1.2. Я использую шаблоны Jinja в кодировке UTF-8. Я заметил, что некоторые символы в этих шаблонах превращаются в вопросительные знаки и прочие тарабарщины. Если я пытаюсь визуализировать шаблоны напрямую без Jinja, я не замечаю этой проблемы. Я обнаружил, что могу это исправить, вызвав .encode("utf-8") на выходе всех моих обработчиков, но это раздражает, так как загромождает мой источник. Кто-нибудь знает, почему это произойдет или что с этим делать? Я сделал небольшой сценарий, чтобы продемонстрировать эту проблему. Файл «char.txt» представляет собой 2-байтовый файл, состоящий исключительно из символа «» »в кодировке UTF-8.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, jinja2, cherrypy
jinja2env = jinja2.Environment(loader=jinja2.FileSystemLoader("."))

class Test(object):
    def test1(self):
        #doesn't work
        #curl "http://example.com/test1"
        #?
        return jinja2env.get_template("char.txt").render()
    test1.exposed = True

    def test2(self):
        #works
        #curl "http://example.com/test2"
        #»
        return open("char.txt").read()
    test2.exposed = True

    def test3(self):
        #works, but it is annoying to have to call this extra function all the time
        #curl "http://example.com/test3"
        #»
        return jinja2env.get_template("char.txt").render().encode("utf-8")
    test3.exposed = True

cherrypy.config["server.socket_port"] = 8500
cherrypy.quickstart(Test())

Ответы [ 2 ]

6 голосов
/ 06 февраля 2011

jinja2 работает только с Unicode.Кажется, что cherrypy обычно использует utf-8 в качестве выходной кодировки, когда клиент не отправляет Accept-Header, но возвращается к iso-8859-1, когда он пуст.

tools.encode.encoding:Если указано, инструмент выдаст ошибку, если ответ не может быть закодирован с ним.В противном случае инструмент будет использовать заголовок запроса «Accept-Charset», чтобы попытаться предоставить подходящие кодировки, обычно пытаясь выполнить utf-8, если клиент не указывает кодировку, но следуя RFC 2616, и пытаясь ISO-8859-1, если клиентотправил пустой заголовок «Accept-Charset».

http://www.cherrypy.org/wiki/BuiltinTools#tools.encode

Я мог бы решить проблему с помощью инструмента кодирования, например:

cherrypy.config["tools.encode.on"] = True
cherrypy.config["tools.encode.encoding"] = "utf-8"

Пример

$ curl "http://127.0.0.1:8500/test1"
»
$ curl "http://127.0.0.1:8500/test2"
»
$ curl "http://127.0.0.1:8500/test3"
»
2 голосов
/ 06 февраля 2011

Из учебника CherryPy :

tools.encode: автоматически преобразует ответ из собственного строкового формата Python Unicode в подходящую кодировку (Latin-1 или UTF-8), например).

Похоже на ваш ответ.

...