在CherryPy中强制响应字符集

时间:2016-08-22 01:22:38

标签: python character-encoding cherrypy

我想通过修改Content-Type标头来指定HTTP响应字符集。但是,它不起作用。

这是一个简短的例子:

#coding=utf-8
import cherrypy

class Website:
    @cherrypy.expose()
    def index(self):
        cherrypy.response.headers['Content-Type']='text/plain; charset=gbk'
        return '。。。'.encode('gbk')

cherrypy.quickstart(Website(),'/',{
    '/': {
        'tools.response_headers.on':True,
    }
})

当我访问该页面时,Content-Type被神秘地更改为text/plain;charset=utf-8,导致浏览器中出现mojibake。

C:\Users\Administrator>ncat 127.0.0.1 8080 -C
GET / HTTP/1.1
Host: 127.0.0.1:8080

HTTP/1.1 200 OK
Server: CherryPy/7.1.0
Content-Length: 6
Content-Type: text/plain;charset=utf-8
Date: Mon, 22 Aug 2016 01:08:13 GMT

。。。^C

似乎CherryPy会检测内容编码并自动覆盖字符集。如果是,我该如何禁用此功能?

2 个答案:

答案 0 :(得分:0)

好的。通过直接篡改cherrypy.response.header_list解决了这个问题。

#coding=utf-8
import cherrypy

def set_content_type():
    header=(b'Content-Type',cherrypy.response._content_type.encode())

    for ind,(key,_) in enumerate(cherrypy.response.header_list):
        if key.lower()==b'content-type':
            cherrypy.response.header_list[ind]=header
            break
    else:
        cherrypy.response.header_list.append(header)

cherrypy.tools.set_content_type=cherrypy.Tool('on_end_resource',set_content_type)

class Website:
    @cherrypy.expose()
    @cherrypy.tools.set_content_type()
    def index(self):
        cherrypy.response._content_type='text/plain; charset=gbk'
        return '。。。'.encode('gbk')

cherrypy.quickstart(Website(),'/')

答案 1 :(得分:0)

通过设置/处理请求标头属性“ Accept-Charset”,我成功设置了内容类型字符集。

cherrypy.request.headers["Accept-Charset"] = "ISO-8859-1"
cherrypy.response.headers["Content-Type"] = "text/xml"

结果:

>curl -I https://127.0.0.1/url?param=value

HTTP/1.1 200 OK
Content-Type: text/xml;charset=ISO-8859-1
Server: CherryPy/18.6.0
Date: Mon, 10 Aug 2020 11:54:49 GMT
Content-Length: 288
Set-Cookie: session_id=d28fa46a1a3d901d9502038255ce869b21add5cc; expires=Mon, 10 Aug 2020 12:54:49 GMT; Max-Age=3600; Path=/