2012-08-07 107 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) 
这里