我有一段时间让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机器开发)。
答案 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