Frage

So das trivialen „Warm-up“ -Anwendungen mit GAE getan, was ich habe. Nun möchte Ich mag etwas mit einer komplexeren Verzeichnisstruktur aufzubauen. Etwas entlang der Linien von:

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

.. etc. Die Controller werden Python-Module werden Anfragen Handhabung. Sie würden dann müssen (Django-Stil) Vorlagen in zugehörigen Ordner zu finden. Die meisten der Demo-Apps Ich resolve Vorlage Pfade so gesehen haben:

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

... die __ __ Datei Eigenschaft löst an den aktuell ausgeführten Skripts. Also, in meinem obigen Beispiel, wenn ein Python-Skript in Controller ausgeführt wurden, / controller1 /, dann ist die ‚myPage.html‘ auf dasselbe Verzeichnis lösen würde - Controller / controller1 / myPage.html - und ich würde lieber sauber trennen meine Python-Code und Vorlagen.

Die Lösung, die ich gehackt habe zusammen fühlt ... hacky:

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

Also, ich bin snipping nur das letzte Element des Pfades für das aktuell laufende Skript und Anhänge das Vorlagenverzeichnis auf den neuen Pfad aus. Die anderen (nicht-GAE spezifisch) Lösungen, die ich für die Lösung Python Pfade gesehen haben scheinen ziemlich Schwergewicht (wie Splitting Pfade in Listen und Manipulation entsprechend). Django scheint für diese eine Antwort zu haben, aber ich würde lieber auf die GAE API-Stick, gegen eine volle Django app erstellen und es für GAE ändern.

Ich gehe davon etwas hartcodierte Rohrkrepierer wäre, da die Apps auf Googles unendliche Server-Farm leben. Also, was ist ein besserer Weg?

War es hilfreich?

Lösung

Sie können keine relativen Pfade verwenden, wie Toni schon sagt, weil Sie keine Garantie haben, dass der Weg von Ihrem Arbeitsverzeichnis in Ihrem App-Verzeichnis wird das gleiche bleiben.

Die richtige Lösung ist entweder die Verwendung os.path.split, wie du bist, oder wie etwas zu verwenden:

path = os.path.join(os.path.dirname(__file__), '..', 'templates', 'myPage.html')
unter Verwendung der obigen Verfahren,

Mein üblicher Ansatz ist es, einen Pfad zum Vorlagenverzeichnis zu generieren und speichern Sie es als Mitglied meines Controller-Objekts, und bietet eine „getTemplatePath“ Methode, die zur Verfügung gestellt Dateinamen nimmt und verbindet es mit dem Basisnamen.

Andere Tipps

Die dirname Funktion gibt einen absoluten Pfad verwenden relative Pfade. Sehen Sie, was das aktuelle Verzeichnis ist, wenn der Controller mit os.path.abspath(os.path.curdir) ausgeführt werden, und baut einen Pfad zu der Vorlage relativ zu dieser Stelle (ohne den os.path.abspath Teil natürlich).

Dies funktioniert nur, wenn das aktuelle Verzeichnis irgendwo in ist siteRoot , sonst könnte man so etwas tun:

template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top