CherryPy无法正确处理Jinja2模板中的非科学字符

2024-10-01 11:20:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用python2.7.1、jinja2.5.2和cherrypy3.1.2运行一个网站。使用jinutja-8编码模板。我注意到这些模板中的一些字符正在变成问号和其他胡言乱语。如果我尝试直接渲染没有Jinja的模板,我不会注意到这个问题。我发现我可以通过在所有处理程序的输出上调用.encode("utf-8")来修复它,但这会让人恼火,因为它会扰乱我的源代码。有人知道为什么会这样吗?或者该怎么办?我做了一个小脚本来演示这个问题。“的”字符.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())

Tags: selftxtcom模板httpjinja2returnexample
2条回答

jinja2只支持Unicode。当客户端发送noAccept-Header时,cherrypy似乎通常使用utf-8作为输出编码,但是当它为空时,它会回到iso-8859-1。在

tools.encode.encoding: If specified, the tool will error if the response cannot be encoded with it. Otherwise, the tool will use the 'Accept-Charset' request header to attempt to provide suitable encodings, usually attempting utf-8 if the client doesn't specify a charset, but following RFC 2616 and trying ISO-8859-1 if the client sent an empty 'Accept-Charset' header.

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

我可以使用这样的编码工具来解决问题:

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

示例

^{pr2}$

CherryPy tutorial

tools.encode: automatically converts the response from the native Python Unicode string format to some suitable encoding (Latin-1 or UTF-8, for example).

听起来像你的答案。在

相关问题 更多 >