5

そこで、GAE で簡単な「ウォームアップ」アプリを作成しました。ここで、より複雑なディレクトリ構造を持つものを構築したいと考えています。次のようなもの:

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

..等。コントローラーは、リクエストを処理する Python モジュールになります。次に、関連付けられたフォルダーに (Django スタイルの) テンプレートを配置する必要があります。私が見たほとんどのデモ アプリは、次のようにテンプレート パスを解決します。

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

...__ file __ プロパティは、現在実行中のスクリプトに解決されます。したがって、上記の例では、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はこれに対する答えを持っているようですが、完全なDjangoアプリを作成してGAE用に変更するよりも、GAE APIに固執したいと思います。

アプリは Google の無限サーバー ファーム上に存在するため、ハードコードされたものはすべてスターターではないと思います。では、より良い方法は何ですか?

4

2 に答える 2

4

Toni が示唆するように、相対パスを使用することはできません。これは、作業ディレクトリからアプリのディレクトリへのパスが同じままであるという保証がないためです。

正しい解決策は、そのまま os.path.split を使用するか、次のようなものを使用することです。

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

私の通常のアプローチは、上記のメソッドを使用してテンプレート ディレクトリへのパスを生成し、それをコントローラー オブジェクトのメンバーとして保存し、提供されたファイル名を取得してベース名と結合する「getTemplatePath」メソッドを提供することです。

于 2008-09-19T15:02:56.883 に答える
1

このdirname関数は絶対パスを返します。相対パスを使用してください。コントローラーが実行されたときに現在のディレクトリが何であるかを確認os.path.abspath(os.path.curdir)し、その場所に関連するテンプレートへのパスを作成します (os.path.abspathコースの一部なし)。

これは、現在のディレクトリがsiteroot内のどこかにある場合にのみ機能します。そうでない場合は、次のようにすることができます。

template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates")
于 2008-09-15T10:37:02.760 に答える