2008-09-15 20 views
3

私はGAEを使って簡単な "ウォームアップ"アプリを作った。今私はより複雑なディレクトリ構造で何かを構築したいと思います。Google App Engineで相対パスを見つけるにはどうすればよいですか?

siteroot/ 
    models/ 
    controllers/ 
     controller1/ 
     controller2/ 
     ... 
    templates/ 
     template1/ 
     template2/ 
     ... 

などの行に沿ったものです。コントローラはリクエストを処理するPythonモジュールになります。彼らは、関連付けられたフォルダに(Djangoスタイルの)テンプレートを配置する必要があります。私はこのような決意テンプレートパスを見てきたデモ・アプリケーションのほとんどは:

path = os.path.join(os.path.dirname(__file__), 'myPage.html') 

を... __ファイル__プロパティは、現在実行中のスクリプトに解決されます。したがって、上記の例では、Pythonスクリプトがcontrollers/controller1 /で実行されている場合、 'myPage.html'は同じディレクトリ(controllers/controller1/myPage.html)に解決されます。 Pythonコードとテンプレート。私は一緒にハッキングしてきた

ソリューションをハック...感じている:

base_paths = os.path.split(os.path.dirname(__file__)) 
template_dir = os.path.join(base_paths[0], "templates") 

だから、私は、現在実行中のスクリプトのパスの最後の要素をオフにつむとにテンプレートディレクトリを追加しています新しいパス。私がPythonのパスを解決するために見た他の(非GAE固有の)ソリューションはかなり重いようです(パスをリストに分割してそれに応じて操作するなど)。 Djangoは答えがあるようですが、私はGAE APIに固執し、Djangoアプリケーションを完全に作成し、GAEに変更します。

Googleの無限のサーバーファーム上にアプリが生存しているため、ハードコードされているものは初心者ではないものと想定しています。では、より良い方法は何ですか?

答えて

4

これは、現在のディレクトリだけがsiteroot内のどこかにある場合、他のあなたは、このような何かを行うことができます動作します作業ディレクトリからアプリケーションのディレクトリへのパスが同じになるようにします。

正しい解決策は、あなたがそうであるように、使用os.path.splitのいずれかにある、またはのようなものを使用する:私のいつものアプローチは、上記の方法を使用してテンプレートディレクトリへのパスを生成することである

path = os.path.join(os.path.dirname(__file__), '..', 'templates', 'myPage.html') 

それを私のコントローラオブジェクトのメンバとして保存し、提供されたファイル名をベース名と結合する "getTemplatePath"メソッドを提供します。

1

dirname関数は絶対パスを返します。相対パスを使用します。コントローラがos.path.abspath(os.path.curdir)で実行されているときに現在のディレクトリが何であるかを確認し、その場所を基準にしたテンプレートへのパスを作成します(もちろんos.path.abspathはありません)。トニが示唆するように、あなたがいない持っているので、あなたは、相対パスを使用することはできません

template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates") 
関連する問題