2011-09-12 37 views
4

我有一個讓CherryPy爲返回的頁面提供必要的css文件的時間。從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,和現在的理解是,根指的是文件系統的絕對路徑,我現在有這樣的配置文件:

[/] 
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的伴t他:

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

在這個配置中,我仍然沒有在我的網頁上得到樣式。當我直接檢查網頁的源文件,然後單擊/css/ab.css鏈接,我得到

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

(注:我正在開發一個Windows機器上)。

+0

而不改變爲相對URL,你可以在頁面上查看源代碼,因爲它是被服務,然後單擊源中的「/css/ab.css」地址? – syrion

+0

我可以,而且我從我的一個CherryPy處理程序接收到一個異常,它表示對/css/ab.css的請求正在接受調度機制,而不是作爲靜態文件提供服務。 –

+0

糟糕,處理程序的結果與相對路徑有關。使用/css/ab.css,我得到「NotFound:(404,」未找到'/css/ab.css'路徑。「)」。 –

回答

12

變化很快!靜態處理程序採用絕對路徑到文件系統。通過設置tools.staticdir.root = "/"您說「從我的硬盤驅動器上提供任何文件」。

噢。現在恐慌結束了,讓我們更詳細地分析一下。首先,staticdir和staticfile是不同的工具,並且不會相互影響(所以如果沒有更多配置,例如tools.staticdir.on = True,那麼只有真正的風險在上面)。如果你想堅持staticfile,你需要提供tools.staticfile.root,而不是tools.staticdir.root。如果您寧願公開整個目錄,則始終將staticfile替換爲staticdir。

其次,我們來修復.root設置。它應該是你的「應用程序」文件夾(即包含'ab.py'等的文件夾)的路徑。第三,staticdir和staticfile工具使用簡單的os.path.join(root, dir)(或根,文件名)確定磁盤路徑,所以如果您提供根,則.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" 
+0

謝謝fumanchu。應用程序僅在我的筆記本電腦上,以便插入孔。我不知道靜態處理程序會相對於我的文件系統而不是應用程序的根。我今天在另一個項目上,但今晚將在這個項目上工作並回復你。再次感謝。 –

+0

根據您的意見和此頁面,使用我當前仍在失敗的配置更新了該問題:http://www.cherrypy.org/wiki/StaticContent。仍然無法弄清楚如何讓它發揮作用。 –

+0

如果您使用的是最新版本的CherryPy,所有內置工具都有一個「調試」模式,可以幫助您快速隔離問題。用'tools.staticdir.debug = True'打開你的配置文件(並確保你在某處發送日誌消息)。 – fumanchu

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') 
+0

我試過了。代替path/to/css,我已經嘗試了關於應用程序目錄('/ css')的路徑以及c:/根目錄中的完整路徑。我在我的ab.py文件的開頭放置了處理程序創建和加載代碼,並刪除了對配置文件的引用。相同的結果。 –

0

我嘗試了好幾個小時,以獲得「官方」 CherryPy的方法來工作,始終與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