2016-08-22 2 views
0

Я хочу указать кодировку ответа HTTP, изменив заголовок Content-Type. Однако это не работает.Принудительная кодировка ответа в CherryPy

Вот краткий пример:

#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, вызывая кракозябры в браузере.

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 обнаруживает кодировку содержимого и автоматически отменяет кодировку. Если да, то как я могу отключить эту функцию?

ответ

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(),'/') 
+0

Вы должны попробовать настройки '' tools.encode.encoding' и tools.decode.encoding' http://docs.cherrypy.org/en/latest/config.html#environments – webKnjaZ

+0

хорошо, сайт я «Работающий» - это сервер обмена файлами, что означает, что кодировка варьируется от файла к файлу. поэтому я не могу жестко закодировать кодировку в конфигурацию cherrypy. – xmcp

+0

Конфигурация Cherrypy может быть переопределена на основе класса или обработчика. Он не должен быть глобальным. – webKnjaZ

Смежные вопросы