从CherryPy提供css文件

时间:2011-09-12 03:39:47

标签: python css cherrypy

我有一段时间让CherryPy为返回的页面提供必要的css文件。

我的目录结构:

Application
     ab.py              (CherryPy application)
     ab.config          (CherryPy config file)
     html\              (html template folder)
        ab.html         (html template file)
     css\               (css folder)
         ab.css         (css file)

ab.html中的链接声明:

  <link href="/css/ab.css" rel="stylesheet" type="text/css" />

最后,ab.config

 [/]
 tools.staticdir.root = "/"

 [/css/ab.css]
 tools.staticfile.on = True
 tools.staticfile.filename = "/css/ab.css"

我的模板已按预期加载并呈现给浏览器,但未应用任何样式。如果我将模板更改为使用相对地址(../css/ab.css)并在浏览器中将模板作为文件打开,则会应用样式。

我需要一段时间才能将配置文件提升到CherryPy在启动应用程序时没有抱怨错误路径的程度。此时它启动,渲染和返回正常,但似乎没有将css文件提供给浏览器。

非常感谢任何帮助。

根据fumanchu的善意建议进行更新:

首选使用staticdir,现在了解root指的是文件系统绝对路径,我现在在配置文件中有这个:

 [/]
 tools.staticdir.root = "c:/users/myaccount/documents/clientname/application"

 [/css]
 tools.staticdir.on = True
 tools.staticdir.dir = "css"

在我的HTML中,我有这个样式表链接:

<link href="/css/ab.css" rel="stylesheet" type="text/css" />

我正在用这个开始CherryPy:

 cherrypy.quickstart(ABRoot(), '/', 'ab.config')

在这种配置中,我仍然没有在我的网页上找到样式。当我检查页面源并直接单击/css/ab.css链接时,我得到了

 NotFound: (404, "The path '/css/ab.css' was not found.")

(注意:我正在使用Windows机器开发)。

3 个答案:

答案 0 :(得分:12)

快速更改!静态处理程序将绝对路径放到文件系统。通过设置tools.staticdir.root = "/",您说“从我的硬盘驱动器中提供任何文件”。

呼。现在恐慌结束了,让我们更详细地分析一下。首先,staticdir和staticfile是不同的工具,并且不进行交互(因此,如果您没有向我们展示更多配置,例如tools.staticdir.on = True),那么您只会面临风险。如果您想坚持使用staticfile,则需要提供tools.staticfile.root,而不是tools.staticdir.root。如果你宁愿暴露整个目录,那么用staticdir替换staticfile。

其次,让我们修复.root设置。它应该是“Application”文件夹的路径(即包含“ab.py”等的文件夹)。

第三,staticdir和staticfile工具确定一个简单os.path.join(root, dir)(或root,filename)的磁盘路径,因此如果你提供root,你的.dir或.filename不应该以一个斜线:

>>> import os
>>> os.path.join('/path/to/Application', '/css/ab.css')
'/css/ab.css'
>>> os.path.join('/path/to/Application', 'css/ab.css')
'/path/to/Application/css/ab.css'

考虑到这一切,试试这个配置:

[/]
tools.staticfile.root = "/path/to/Application"

[/css/ab.css]
tools.staticfile.on = True
tools.staticfile.filename = "css/ab.css"

答案 1 :(得分:1)

这对我有用:

static_handler = cherrypy.tools.staticdir.handler(section="/", dir=settings.STATIC_ROOT)
cherrypy.tree.mount(static_handler, '/static')

或在你的情况下:

css_handler = cherrypy.tools.staticdir.handler(section="/", dir='path/to/css')
cherrypy.tree.mount(css_handler, '/css')

答案 2 :(得分:0)

我试了几个小时才能使“官方”的樱桃方法起作用,总是得到404结果。但谷歌小组的这个解决方案就像一个魅力,所以我在这里重新发布,更多的人会发现它。

无论出于何种原因,cherrypy的内部包装器都不起作用,但这会将给定文件夹中的所有文件都公开。

class StaticServer(object):
    """For testing - serves static files out of a given root.
    """

    def __init__(self, rootDir):
        self.rootDir = rootDir
        if not os.path.isabs(self.rootDir):
            self.rootDir = os.path.abspath(rootDir)

    @cherrypy.expose
    def default(self, *args):
        file = os.path.join(self.rootDir, *args)
        return cherrypy.lib.static.serve_file(file)

Usage:
class Root(object):
    static = StaticServer(r'./static')

然后,如果您在<root>/static中放置一个文件,它就会有效。

来源:https://groups.google.com/forum/#!topic/cherrypy-users/5h5Ysp8z67E