如何在Bottle中使用CherryPy启用gzip压缩

2 投票
2 回答
2104 浏览
提问于 2025-04-18 01:34

Bottle的官方文档中提到:

... Bottle项目建议,Gzip压缩最好由Bottle运行的WSGI服务器来处理。像cherrypy这样的WSGI服务器提供了一个叫做GzipFilter的中间件,可以用来实现这个功能。

目前,我是这样运行我的Bottle服务器的:

app.run(host='...', port=8080, server='cherrypy')

我该如何让cherrypy使用gzip压缩呢?


我可以这样获取cherrypy服务器对象,但我还是搞不清楚怎么启用gzip:

class CherryPyGzip(ServerAdapter):
  def run(self, handler): 
    from cherrypy import wsgiserver
    server = wsgiserver.CherryPyWSGIServer((self.host, self.port), handler)

    # enable gzip here somehow?

    try:
      server.start()
    finally:
      server.stop()

app.run(host='...', port=8080, server=CherryPyGzip)

2 个回答

0

这是个大胆的猜测,因为我对CherryPy不太熟悉:把这个代码放在你写“在这里启用gzip”的那一行。

cherrypy.config.update({'tools.gzip.on': True})

(这个想法受到这篇文章的启发。)

有没有成功呢?

4

CherryPy有一个Gzip工具,但这个工具只适用于CherryPy自己开发的应用程序。所以,如果你想在其他应用中使用Gzip,就需要借助第三方的Gzip WSGI中间件(这里提到的wsgigzip只是一个例子,我并不知道哪个中间件最好用):

import cherrypy
import wsgigzip


application = wsgigzip.GzipMiddleware(bottle.default_app())

cherrypy.config.update({'server.socket_host': "0.0.0.0",
                        'server.socket_port': 8080})
cherrypy.tree.graft(application, "/")
cherrypy.engine.start()
cherrypy.engine.block()

更好的选择是使用uWSGI作为服务器,它除了能做gzip之外,还有很多其他很棒的功能。

撰写回答