2011-09-12 20 views
4

私は、CherryPyが返されたページに必要なCSSファイルを提供するのに時間を浪費しています。CherryPyからのCSSファイルの提供

私のディレクトリ構造:ab.htmlで

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) 

リンク声明:

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

そして最後に、

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

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

ab.configマイテンプレートがロードされ、にレンダリングブラウザは私が期待した通りだが、スタイリングは適用されていない。相対アドレス(../css/ab.css)を使用するようにテンプレートを変更し、テンプレートをブラウザでファイルとして開くと、スタイリングが適用されます。

アプリケーションを起動するときに、CherryPyが悪いパスについて文句を言っていないところまで設定ファイルを取得するのに、しばらく時間がかかりました。この時点で、レンダリングは開始され、レンダリングされ、正常に戻りますが、単にcssファイルをブラウザに表示するようには見えません。

大変助かりました。 fumanchuからの親切な提案に基づいて

更新:

がstaticdirを使用することを好む、と今ルートはファイルシステムの絶対パスを参照していることを理解し、私は今、configファイルでこれを持っている:

[/] 
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') 

この設定では、私はまだ私のWebページでスタイリングを取得しません。私は、ページのソースをチェックして、直接/css/ab.cssリンクをクリックすると、私は(私はWindowsマシン上で開発しています)

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

を取得します。

+0

相対URLに変更がなければ、あなたはそれが提供されていますように、ページのソースを表示し、ソース内の「/css/ab.css」アドレスをクリックすることができますか? – syrion

+0

私はCcyPyハンドラから/css/ab.cssへのリクエストが静的ファイルとして提供されるのではなく、ディスパッチメカニズムの対象であることを示す例外を受け取ることができます。 –

+0

ハンドラからの結果は、相対パスになります。 /css/ab.cssで "NotFound:(404、"パス '/css/ab.css'が見つかりませんでした ")"というメッセージが表示されます。 –

答えて

12

はすぐにそれを変更し静的ハンドラは、ファイルシステムに対して絶対パスを使用します。 tools.staticdir.root = "/"を設定すると、「ハードドライブからファイルを提供する」と表示されます。

Whew。パニックが終わったので、より詳細に分析してみましょう。まず、staticdirとstaticfileは異なるツールで、対話しません(tools.staticdir.on = Trueのように、より多くの設定が表示されている場合は、上記のリスクしかありません)。 staticfileを使用する場合はtools.staticfile.rootでなければなりません。tools.staticdir.rootではありません。むしろディレクトリ全体を公開したいのであれば、staticfileをstaticdirに置き換えてください。

次に、.rootの設定を修正します。これは、 "アプリケーション"フォルダ(つまり、 'ab.py'などを含むフォルダ)へのパスにする必要があります。

第3に、(またはroot、filename)のディスクパスを決定するので、ルートを指定する場合、.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

私は404結果といつも、仕事をする「公式」CherryPyにメソッドを取得するために時間を試みました。しかし、Googleグループのこのソリューションは魅力的な働きをしていましたので、ここで再掲載しています。

どんな理由であれ、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

関連する問題