Flask/Tornado中的Gzip响应

6

我有一个简单的Flask应用正在运行。我使用Tornado进行服务。启动服务器的代码如下:

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

在这里,app是Flask WSGI应用程序对象(app = Flask(__name__))。

现在服务器以整个JSON响应的形式响应每个请求,是否有一种(简单)方法返回Gzipped数据? 在Tornado网站上,我找到了http://www.tornadoweb.org/documentation/releases/v2.1.0.html?highlight=gzip,所以使用Tornado可以实现,但是Flask解决方案也很好。


2
这里的简单方法是使用nginx作为反向代理并在那里压缩数据。这比使用Python Web服务器要快得多。 - Nikolay Fominyh
这可能是真的,但我不想运行nginx所带来的额外负担。 - TTT
1
Nginx或其他低级Web服务器几乎总是用作Tornado的反向代理。当您在Python上压缩内容时,它非常慢而且奇怪,因为您已经有了Nginx来完成这项工作。顺便说一下,您可以深入研究这个主题。http://flask.pocoo.org/mailinglist/archive/2010/6/14/gzip-compression/#13cd7c9498f74538f48d2a4e557c8148 - Nikolay Fominyh
3个回答

6
最简单的方法是使用Nginx,就像Nikolay建议的那样。它不会增加太多开销。
对于`tornado.web.Application`,您只需要在初始化应用程序时传递`compress_response=True`即可。由于您正在使用Flask,因此这种方法行不通。您可以查看Tornado的源代码并了解它正在做什么,但这并不简单。

从Tornado 4.0开始,'gzip'的名称已更改为'compress_response'。 - neutrinus
谢谢!这样压缩了我所有的API调用响应。顺便说一下,我将其作为键值对添加到设置JSON中。我们可以使用的完整设置列表:https://www.tornadoweb.org/en/stable/web.html#tornado.web.Application.settings - Nikhil VJ

4

那个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 - Graham Dumpleton

4
假设您想要回复一个POST请求,那么在您的tornado.web.RequestHandler派生类中,在“def post(self):”内部进行回复。
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)

gzip_compress.compress(response)部分出现错误:TypeError: 需要字节类似的对象,而不是'str'。 - Nikhil VJ
成功了!gzip_compress.compress(str.encode(response)) - Nikhil VJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接