【问题标题】:Serving static directories in CherryPy在 CherryPy 中提供静态目录
【发布时间】:2017-07-17 17:12:22
【问题描述】:

我正在尝试使用 CherryPy 提供静态文件,但我做不到。我查看了教程,但这样设置也无法正常工作。

所有这些都使用 Python 3.4

配置

config = {
        '/ws': {
            'tools.websocket.on': True,
            'tools.websocket.handler_cls': ChatWebSocketHandler,
            'tools.websocket.protocols': ['toto', 'mytest', 'hithere']
        },
        '/assets': {
              'tools.staticdir.on': True,
              'tools.staticdir.dir': constants.TEMPLATE_PATH
        },
    }

我正在像这样启动cherryPy

app_root = Root(args.host, args.port, args.ssl, ssl_port=args.ssl_port)
cherrypy.quickstart(app_root, '', config=config)

固定路径是

TEMPLATE_PATH = os.path.join(os.path.dirname(os.path.realpath(__file__)),"assets/")

我也尝试过使用assets//assets/ 等路径来代替上述常量。

问题是它无法识别其中任何人,并且总是给出 404 错误。

【问题讨论】:

  • 您的上述配置应该可以工作。我的一个应用程序中有一个几乎相同的应用程序。您需要使用您拥有的 tools.staticdir.dir 的绝对路径。唯一的区别是我使用cherrypy.tree.mount(Root(), "/", config),然后是cherrypy.engine.start(),然后是cherrypy.engine.block(),而不是快速启动。你检查权限是否正确?
  • 这也可以在 Python 2.7 中运行 3 个月。

标签: python cherrypy


【解决方案1】:

我也很难设置这个。我有一个相当复杂的设置,其中包含多个子域,这些子域已经通过几个可能不再有效的 CherryPy 早期版本演变而来,而且我还没有验证这将在您在这里拥有的更简单的快速入门配置中工作。但是,实际上对我有用的设置中的关键行是将下面的配置行放在您挂载的 web 服务对象中。我将定义静态目录的配置字典放在类定义中的任何资源之前。在我看来,您已经在配置字典中定义了静态目录,而不是特定资源而不是对象。所以也许尝试在您的托管服务对象中:

class WebService(object):
    _cp_config = {
                  'tools.staticdir.on': True,
                  'tools.staticdir.dir': '/path/to/serve/static/files/from'
                  }

    @cherrypy.expose
         def index(self):

   [ ...additional resource definitions, etc ...] 

后来:

    my_cp_app = 
    cherrypy.tree.mount(subDomain.WebService(),
                        '/subdomainFileLocation',
                        subdomainConfigDict)

    cherrypy.quickstart(config=domainConfig)

我知道您正在使用 Python 3。以上内容适用于我在 Python 2.7 + cherrypy-8.1.2 上。我希望这是有帮助的。

【讨论】:

    最近更新 更多