2008-09-15 9 views
3

Also habe ich die trivialen "Warmup" -Apps mit GAE gemacht. Jetzt möchte ich etwas mit einer komplexeren Verzeichnisstruktur erstellen. Etwas in der Art von:Was ist ein guter Weg, um relative Pfade in Google App Engine zu finden?

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

..etc. Die Controller werden Python-Module sein, die Anfragen bearbeiten. Sie müssten dann (Django-Stil) Vorlagen in zugehörigen Ordnern suchen. Die meisten der Demo-Apps Ich resolve Vorlage Pfade so gesehen haben:

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

... die __ Datei löst __ Eigenschaft auf den aktuell ausgeführten Skripts. Wenn in meinem obigen Beispiel ein Python-Skript in controllers/controller1/ausgeführt würde, würde die "myPage.html" in dasselbe Verzeichnis aufgelöst werden - controllers/controller1/myPage.html - und ich würde meine Datei sauber trennen 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 Wegschneiden nur das letzte Element des Pfades für das aktuell laufende Skript und Anhängen des Vorlagenverzeichnis auf die neuer Weg. Die anderen (nicht GAE-spezifischen) Lösungen, die ich zum Auflösen von Python-Pfaden gesehen habe, scheinen ziemlich schwergewichtig zu sein (z. B. das Aufteilen von Pfaden in Listen und das entsprechende Manipulieren). Django scheint dafür eine Antwort zu haben, aber ich bleibe lieber bei der GAE-API, anstatt eine vollständige Django-App zu erstellen und sie für GAE zu modifizieren.

Ich nehme an, alles hartcodierte wäre nicht Starter, da die Apps auf der unendlichen Serverfarm von Google leben. Also, was ist ein besserer Weg?

Antwort

4

Sie können nicht verwenden relative Pfade, wie Toni schon sagt, weil Sie nicht haben Stellen Sie sicher, dass der Pfad von Ihrem Arbeitsverzeichnis zum Verzeichnis Ihrer App gleich bleibt.

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') 

Mein üblicher Ansatz ist es, einen Pfad zum Vorlagenverzeichnis unter Verwendung des oben genannte Verfahrens zur Erzeugung , und speichern Sie es als Mitglied meines Controller-Objekts, und stellen Sie eine "getTemplatePath" -Methode bereit, die den angegebenen Dateinamen übernimmt und mit dem Basisnamen verknüpft.

1

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

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

template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates") 
Verwandte Themen