【问题标题】:How do I enable gzip compression in bottle with cherrypy如何使用cherrypy在瓶子中启用gzip压缩
【发布时间】:2014-05-18 12:19:47
【问题描述】:

bottle docs 说:

... Bottle 项目建议 Gzip 压缩最好由运行在其之上的 WSGI 服务器来处理。诸如cherrypy之类的WSGI服务器提供了一个GzipFilter中间件,可以用来完成这个。

目前,我正在运行我的瓶子服务器:

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)

【问题讨论】:

  • 除了更少的选项,比如 gzip 之外,瓶子的作用与cherrypy 不同吗?为什么要同时使用。至于 gzip - 我在发送之前使用 javascript 对其进行 gzip。你试过吗?
  • @MarcMaxson:我同时使用这两种方法是因为随瓶子一起提供的 wsgi 服务器被标记为不太适合现实世界(IIRC,它不是线程化的),并且文档建议使用 cherrypy 进行 gzip 压缩。你能详细说明一下 JavaScript gzipping 的事情吗?这对我来说没有任何意义,因为我没有运行 nodejs,因此没有服务器端 JavaScript。

标签: python gzip wsgi cherrypy bottle


【解决方案1】:

CherryPy 有 Gzip 工具,但它只适用于 CherryPy 原生应用。所以你需要使用 3rd 方 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 作为服务器,它can do gzip 以及许多其他强大的功能。

【讨论】:

  • host='...', port=8080 移动到哪里?
  • @Eric 对,那就是 config.update()。密钥是server.socket_hostserver.socket_port
  • 服务器工作,但 chrome devtools 不报告任何压缩:(
  • @Eric 显然 CherryPy 的工具不适用于任意 WSGI 应用程序,因此您需要使用中间件。更新了我的答案。
【解决方案2】:

暗中刺伤(因为我不熟悉 CherryPy):将其放在您有“在此处启用 gzip”注释的地方。

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

(灵感来自this。)

运气好吗?

【讨论】:

  • 无赖。 :(希望你弄清楚。
猜你喜欢
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 2014-09-26
  • 2012-09-21
  • 2018-02-07
  • 1970-01-01
相关资源
最近更新 更多