【发布时间】:2013-01-23 06:53:39
【问题描述】:
我在 CherryPy 处理静态文件时遇到了困难。问题与处理 URL 的尾部斜杠有关。有时会添加缺少的斜线,有时则不会:行为是不可预测的。我确信那里潜伏着一个错误。当我添加或删除一些静态文件时,该错误似乎出现了。看起来可能有一个未初始化的变量在处理斜杠的函数中创建了一个未确定的状态。我已经整理了一个显示问题的最小应用程序(至少在我的机器中)。我在 Ubuntu 12.10 下使用 CherryPy 3.2.2。
import cherrypy
class Root(object): pass
conf = {
'/':{
'tools.staticdir.on': True,
'tools.staticdir.dir': '/home/bob/www',
'tools.staticdir.index': 'index.htm',
'tools.staticdir.debug': True,
},
}
cherrypy.tree.mount(Root(), '/', config=conf)
cherrypy.engine.start()
cherrypy.engine.block()
我的实验性静态文件夹 (/home/bob/www) 的结构非常简单:
/home/bob/www/index.htm <-- This file is just <html><body>Hello</body></html>
/home/bob/www/dir/index.htm <-- This files includes a <img src="picture.jpg"> tag in it
/home/bob/www/dir/picture.jpg <-- Any picture will do
如果我浏览 localhost:8080/dir/,结果页面会显示图像。
如果我浏览 localhost:8080/dir,结果页面不显示图像。
任何帮助将不胜感激。也许我没有正确配置应用程序,因为我是 CherryPy 的新手。
谢谢,
鲍勃
附:我已经阅读了 stackoverflow.com/questions/10276060,它有类似的问题,但使用了 Routes。我不使用路由。
【问题讨论】:
-
可能会尝试在您的配置中使用
'tools.trailing_slash.on': True行启用trailing_slash工具。咨询Docs page -
@Felix,我尝试了您的建议,但无济于事。无论如何,我认为
'tools.trailing_slash.on': True是默认值。演示迷你应用程序很简单,我想做的是非常基本的。我想知道其他人是否遇到过这个问题。 -
我认为这是浏览器级别的 URI 中“目录”的含义的一些基本混淆。在 Chrome 中,当我访问
localhost:8080/dir时,它会将“picture.jpg”请求发送到localhost:8080/picture.jpg基本上,Chrome 无法知道localhost:8080/dir是一个目录,而不仅仅是一个 file。它假定它是一个文件,因此它将路径“picture.jpg”解析为/picture.jpg(这是正确的)。但是,如果 URI 以斜杠结尾,则浏览器似乎会假设“嘿,这是一个目录,而不是文件”并相应地对待它。 -
@Felix,有趣的观察。我已经用 Firefox 和 Chromiun 测试了这个“错误”,并且都显示了相同的结果。我不是这方面的专家,但在我看来,在这方面 CherryPi 服务器的行为应该类似于 Apache 的行为。当 Apache 收到对“目录”的请求并且尾部斜杠丢失时,它会将浏览器重定向到包含尾部斜杠的新 URI。从此时起,所有相关 URI 都按预期工作。我的原始站点使用 Apache 和 mod_python,我想切换到 CherryPy。
-
似乎有一种单行破解方法可以解决此问题。查看文件“static.py”(cherrypy/lib)。在
staticdir()函数的末尾,有一个语句:if handled: request.is_index = filename[-1] in (r"\/")似乎用if handled: request.is_index = True替换它会给出你想要的行为,并结合'trailing_slash' 工具。 (它与那里的切换有关,request.is_index。不能保证这是 100% 安全或正确的做法。建议在 Google Groups 上的 cherrypy-users 组上提问,你会得到更好的回答。
标签: python cherrypy static-files trailing-slash