2017-02-17 49 views
0

我有一個cherrypy應用程序,我試圖改變響應頭Content-type。我試圖用cherrypy.response.header ['Content-Type'] ='text/plain'來做到這一點。不幸的是,我仍然在收到'text/html'。我想爲ok請求設置一種內容類型,併爲錯誤消息設置另一種內容類型。我如何更改內容類型的唯一方法是使用我的裝飾器。但是這種方法的設置類型,我需要改變它。你知道哪裏可能是一個問題? 我的配置:Cherrypy和內容類型

config = { 
    '/': { 
     'request.dispatch': cherrypy.dispatch.MethodDispatcher(), 
     'tools.response_headers.on': True, 
     'tools.response_headers.headers': [('Content-Type', 'text/html')], 
    } 
} 



def GET(self, id): 
    cherrypy.response.headers['Content-Type'] = 'application/x-download' 
    somecode 
    if res < None: 
     cherrypy.response.headers['Content-Type'] = 'text/plain'   
     cherrypy.response.status=404 

GET._cp_config = {'response.stream': True} 
+0

您是否試圖發送'404 Not Found'的自定義響應?請查看:https://github.com/cherrypy/cherrypy/blob/master/cherrypy/_cperror.py#L49-L111 可以爲構建自定義響應設置自定義調用。 – webKnjaZ

+0

不幸的是沒有工作。我試着玩cherrypy.expose(),行爲正在發生一些變化。任何人都可以解釋我是如何工作的? – George

+0

究竟是什麼?請詳細描述你想要達到的目標,並提供更完整的代碼片段。 – webKnjaZ

回答

0
def stream(): 
def decorate(func): 
    def wrapper(*args, **kwargs): 
     name = time.strftime("%Y%m%d-%H%M%S") 
     cherrypy.response.headers['Content-Type'] = 'application/x-download' 
     cherrypy.response.headers['Content-Disposition'] = 'attachment; filename="' + name + '.txt"' 
     cherrypy.response.headers['Transfer-Encoding'] = 'chunked' 
     return func(*args, **kwargs) 
    return wrapper 
return decorate 



    @cherrypy.expose 
    class Network: 
@stream() 
def GET(self, id): 
    source = my_generator() 
    for i in source: 
     if res < None: 
      cherrypy.response.headers['Content-Type'] = 'text/plain'   
      cherrypy.response.status=404 
      break 
     yield bytes(i) 

GET._cp_config = {'response.stream': True} 

好了,還有更復雜的代碼,CherryPy的配置的是在以前的評論。我有一個生成器,它可以生成一些數據,並將文件中的數據傳輸到客戶端。我知道,肯定有更好的解決方案。想象一下,在res變量中有從保存到db的結果。問題是,這完全忽略了if條件中的設置。它仍然返回一個文件(空的)。裝飾者是如何設置內容類型的唯一方式,這就是爲什麼它存在