2012-08-07 83 views
4

我有一個簡單的Flask應用程序正在運行。爲了服務我使用龍捲風。啓動服務器的代碼如下所示:Flask/Tornado中的Gzip響應

# Run the app in server mode 
http_server = HTTPServer(WSGIContainer(app)) 
http_server.listen(port) 
IOLoop.instance().start() 

應用是瓶WSGI應用對象(app = Flask(__name__))。

現在,服務器用整個JSON答案響應每個請求,是否有返回Gzipped數據的(簡單)方式?在龍捲風網站上,我發現http://www.tornadoweb.org/documentation/releases/v2.1.0.html?highlight=gzip,所以它必須與龍捲風一起使用,但Flask解決方案也很棒。

+2

簡單的方式 - 是使用nginx作爲反向代理和gzip數據。它比使用python web服務器要快得多。 – 2012-08-08 07:18:59

+0

這可能是真的,但我不想運行nginx的開銷。 – TTT 2012-08-08 10:14:03

+1

Nginx或其他低級Web服務器幾乎總是用在龍捲風前面作爲反向代理。當你在python上壓縮內容時 - 它很慢,而且很奇怪,因爲你已經有nginx在這個工作上吃狗了。順便說一句,你可以潛入這個主題。 http://flask.pocoo.org/mailinglist/archive/2010/6/14/gzip-compression/#13cd7c9498f74538f48d2a4e557c8148 – 2012-08-08 10:21:38

回答

4

它只是設置一個nginx只有gzip壓縮看起來很奇怪。

現在我用這個http://code.google.com/p/ibkon-wsgi-gzip-middleware/,這很好。

+0

GZIP中間件不符合WSGI標準,可能會導致問題。 https://code.google.com/p/ibkon-wsgi-gzip-middleware/issues/detail?id=2 https://code.google.com/p/ibkon-wsgi-gzip-middleware/issues/detail ?ID = 3 – 2014-01-23 23:47:37

4

最簡單的方法是使用Nginx,就像Nikolay建議的那樣。它不會增加很多開銷。

隨着tornado.web.Application,你可以在初始化應用時通過compress_response=True。由於您使用的是Flask,因此無法使用。你可以看看龍捲風來源,看看它在做什麼,但這並不簡單。

+0

從龍捲風4.0'gzip'更名爲'compress_response' – neutrinus 2014-11-03 08:58:14

+0

@neutrinus謝謝,更新。 – 2014-11-03 12:48:23

1

假設你要回復POST請求,然後在你的tornado.web.RequestHandler派生類中,內「DEF後(個體經營):」

self.set_header("Content-type", 'text/plain') # or whatever you expect 
self.set_header("Content-Encoding", 'gzip') 
# don't forget to import zlib 
gzip_compress = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16) 
# response is the string where your response is 
content = gzip_compress.compress(response) + gzip_compress.flush() 
compressed_content_length = len(content) 
self.set_header("Content-Length", compressed_content_length) 
self.write(content) 
這裏