Google App Engine で相対パスを見つける良い方法は何ですか?
-
09-06-2019 - |
質問
そこで、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 にはこれに対する答えがあるようですが、私はどちらかというと GAE API にこだわりたいと思っています。完全な Django アプリを作成し、それを GAE 用に変更します。
アプリは Google の無限サーバー ファーム上に存在するため、ハードコードされたものは起動に適さないと思います。では、より良い方法は何でしょうか?
解決
Toni 氏が示唆しているように、相対パスを使用することはできません。作業ディレクトリからアプリのディレクトリまでのパスが同じままであるという保証がないからです。
正しい解決策は、そのまま os.path.split を使用するか、次のようなものを使用することです。
path = os.path.join(os.path.dirname(__file__), '..', 'templates', 'myPage.html')
私の通常のアプローチは、上記のメソッドを使用してテンプレート ディレクトリへのパスを生成し、それをコントローラー オブジェクトのメンバーとして保存し、指定されたファイル名を取得してベース名と結合する「getTemplatePath」メソッドを提供することです。
他のヒント
の dirname
関数は絶対パスを返します。相対パスを使用してください。コントローラーが実行されるときの現在のディレクトリを確認します。 os.path.abspath(os.path.curdir)
そして、その場所を基準にしてテンプレートへのパスを構築します ( os.path.abspath
もちろん一部です)。
これは、現在のディレクトリが内部のどこかにある場合にのみ機能します。 サイトルート, 、それ以外の場合は、次のようなこともできます。
template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates")