Ich habe kürzlich Django von v1.3.1 auf v1.4 aktualisiert.
In meinem alten settings.py
habe ich
TEMPLATE_DIRS = (
os.path.join(os.path.dirname( __file__ ), 'templates').replace('\\', '/'),
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
Dies wird darauf hinweisen /Users/hobbes3/Sites/mysite/templates
, aber da Django v1.4 den Projektordner auf die gleiche Ebene wie die App-Ordner verschoben hat , befindet sich meine settings.py
Datei jetzt in /Users/hobbes3/Sites/mysite/mysite/
statt /Users/hobbes3/Sites/mysite/
.
Eigentlich ist meine Frage jetzt zweifach:
- Wie verwende ich
os.path
in einem Verzeichnis einer Ebene suchen oben aus__file__
. Mit anderen Worten, ich möchte/Users/hobbes3/Sites/mysite/mysite/settings.py
finden/Users/hobbes3/Sites/mysite/templates
mit relativen Pfaden. - Sollte ich das sein halten
template
Ordner (die Quer App - Vorlagen hat, wieadmin
,registration
etc.) auf/User/hobbes3/Sites/mysite
Projektebene oder auf/User/hobbes3/Sites/mysite/mysite
?
os
zucd
zu../mysite
? Oder was auch immer Sie wollensettings.py
auf mehreren Servern verwende. Der einzige Unterschied könnten die Datenbankanmeldeinformationen sein. Ich habe dieos.path
Dokumentation gelesen , aber keinen Befehl gefunden, mit dem Sie ein Verzeichnis aufrufen können. Wiecd ..
.os.path.join( os.path.dirname( __file__ ), '..' )
..
bedeutet , das Verzeichnis über das ganze Dateisystem, nicht nur , wenn übergebencd
.os.path.join( os.path.dirname ( __file__), os.path.pardir)
Antworten:
Wie weit der Vorlagenordner gehen soll, weiß ich nicht, da Django 1.4 gerade herausgekommen ist und ich es mir noch nicht angesehen habe. Sie sollten wahrscheinlich eine andere Frage zu SE stellen, um dieses Problem zu lösen.
Sie können
normpath
den Pfad auch verwenden, anstatt ihn zu bereinigenabspath
. In dieser Situation erwartet Django jedoch eher einen absoluten als einen relativen Pfad.Verwenden Sie
os.pardir
aus Gründen der plattformübergreifenden Kompatibilität anstelle von'..'
.quelle
..
oder etwas? Warum bekommt diese Antwort weniger Stimmen?normpath
. Außerdem werden Symlinks ordnungsgemäß durchlaufen./Users/hobbes3/Sites/mysite/mysite/../templates
lautet die eigentliche Zeichenfolge für den Pfadnamen , was vollkommen in Ordnung ist, aber nur ein wenig überladener. Es stellt auch sicher, dass Djangos Erinnerung an die Verwendung absoluter Pfade eingehalten wird. Wenn Sie sich in einer anderen Situation befinden, in der ein relativer Pfad verwendet wird, sollten Sie stattdessen den Normpfad verwenden, um Ihre Pfade zu vereinfachen.os.pardir
denos
Dokumenten nie auf den GrundUm den Ordner einer Datei zu erhalten, verwenden Sie einfach:
Um einen Ordner zu erstellen, verwenden Sie ihn einfach
os.path.dirname
erneutVielleicht möchten Sie überprüfen, ob
__file__
es sich um einen Symlink handelt:quelle
n
Ordner aufzurufen, ohne dieos.path.dirname
n
Zeiten anrufen zu müssen ?pathlib.Path.parents[levels_up-1]
. Siehe diese Frage für weitere LösungenWenn Sie Python 3.4 oder höher verwenden, können Sie bequem mehrere Verzeichnisse nach oben verschieben
pathlib
:quelle
Sie wollen genau das:
quelle
Persönlich würde ich mich für den Funktionsansatz entscheiden
quelle
os.path.dirname('/tmp/lala/')
immer noch zurückkehren'/tmp/lala'
Ich denke, das Einfachste ist, dirname () wiederzuverwenden, damit du anrufen kannst
Wenn sich Ihre Datei unter /Users/hobbes3/Sites/mysite/templates/method.py befindet
Dies gibt "/ Users / hobbes3 / Sites / mysite" zurück.
quelle
Aktualisieren:
Wenn Sie
settings.py
durch Symlinking "kopieren" , ist die Antwort von @ forivall besser:Die obige Methode wird "sehen",
wrong.html
während die Methode von @ forivall sehen wirdright.html
In Abwesenheit von Symlinks sind die beiden Antworten identisch.
quelle
Dies kann in anderen Fällen nützlich sein, in denen Sie x Ordner nach oben verschieben möchten. Führen Sie einfach
walk_up_folder(path, 6)
6 Ordner aus.quelle
for _ in xrange(depth)
anstatt die lokale Variable zu verfolgen.Für einen Paranoiden wie mich würde ich diesen vorziehen
quelle
'/'
sollten Sie stattdessenos.sep
Gehen
n
Ordner auf ... runup(n)
quelle
Natürlich: einfach benutzen
os.chdir(..)
.quelle
Mit der Verwendung können
os.path
wir ein Verzeichnis so nach oben gehenAuch nachdem Sie das gewünschte Verzeichnis gefunden haben, können Sie sich mit einem anderen Datei- / Verzeichnispfad verbinden
quelle