Niedawno zaktualizowałem Django z wersji 1.3.1 do wersji 1.4.
W moim starym settings.py
mam
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.
)
To wskaże /Users/hobbes3/Sites/mysite/templates
, ale ponieważ Django v1.4 przeniósł folder projektu na ten sam poziom, co foldery aplikacji , mój settings.py
plik jest teraz /Users/hobbes3/Sites/mysite/mysite/
zamiast /Users/hobbes3/Sites/mysite/
.
Tak więc moje pytanie jest teraz dwojakie:
- Jak użyć,
os.path
aby spojrzeć na katalog o jeden poziom wyżej od__file__
. Innymi słowy, chcę/Users/hobbes3/Sites/mysite/mysite/settings.py
znaleźć/Users/hobbes3/Sites/mysite/templates
przy użyciu ścieżek względnych. - Powinienem być utrzymanie
template
folder (który ma przekrój szablony aplikacji, jakadmin
,registration
etc.), w projekcie/User/hobbes3/Sites/mysite
poziomu lub co/User/hobbes3/Sites/mysite/mysite
?
os
docd
celu../mysite
? Lub cokolwiek chceszsettings.py
na wielu serwerach. Jedyną różnicą mogą być poświadczenia bazy danych. Czytałemos.path
dokumentację, ale nie mogłem znaleźć polecenia, które pozwoli ci przejść do jednego katalogu. Jakcd ..
.os.path.join( os.path.dirname( __file__ ), '..' )
..
oznaczać powyższy katalog w całym systemie plików, nie tylko po przekazaniu docd
.os.path.join( os.path.dirname ( __file__), os.path.pardir)
Odpowiedzi:
Jeśli chodzi o to, gdzie powinien iść folder szablonów, nie wiem, ponieważ Django 1.4 właśnie wyszedł i jeszcze go nie przeglądałem. Prawdopodobnie powinieneś zadać kolejne pytanie w sprawie SE, aby rozwiązać ten problem.
Możesz także użyć
normpath
do czyszczenia ścieżki zamiastabspath
. Jednak w tej sytuacji Django oczekuje ścieżki bezwzględnej, a nie ścieżki względnej.Aby uzyskać zgodność między platformami, użyj
os.pardir
zamiast'..'
.źródło
..
czy użyć czegoś takiego? Dlaczego ta odpowiedź ma mniej głosów?normpath
. Ponadto prawidłowo przejdzie dowiązania symboliczne./Users/hobbes3/Sites/mysite/mysite/../templates
, co jest w porządku, ale tylko trochę bardziej zagracony. Zapewnia również przestrzeganie przypomnienia Django o użyciu ścieżek bezwzględnych. Jeśli znajdujesz się w innej sytuacji, która korzysta ze ścieżki względnej, powinieneś użyć normpath, aby uprościć ścieżki.os.pardir
, nigdy tak naprawdę nie dotarłem do sednaos
dokumentów)Aby uzyskać folder pliku, użyj:
Aby otworzyć folder, użyj go
os.path.dirname
ponownieMożesz sprawdzić, czy
__file__
jest to dowiązanie symboliczne:źródło
n
folderów bez konieczności dzwonieniaos.path.dirname
n
?pathlib.Path.parents[levels_up-1]
. Zobacz to pytanie dla bardziej rozwiązańJeśli używasz języka Python 3.4 lub nowszego, wygodnym sposobem na przejście do wielu katalogów jest
pathlib
:źródło
Chcesz dokładnie to:
źródło
Osobiście wybrałbym podejście funkcyjne
źródło
os.path.dirname('/tmp/lala/')
Wciąż zwracają'/tmp/lala'
Myślę, że najłatwiej jest po prostu ponownie użyć dirname (), abyś mógł zadzwonić
jeśli plik znajduje się w /Users/hobbes3/Sites/mysite/templates/method.py
Zwróci „/ Users / hobbes3 / Sites / mysite”
źródło
Aktualizacja:
Jeśli zdarzy ci się „kopiować”
settings.py
przez dowiązanie symboliczne, odpowiedź @ forivall jest lepsza:Powyższa metoda „zobaczy”,
wrong.html
podczas gdy metoda @ forivall zobaczyright.html
W przypadku braku dowiązań symbolicznych dwie odpowiedzi są identyczne.
źródło
Może to być przydatne w innych przypadkach, gdy chcesz podnieść x folderów w górę. Wystarczy uruchomić,
walk_up_folder(path, 6)
aby przejść o 6 folderów.źródło
for _ in xrange(depth)
zamiast śledzić zmienną lokalną.Dla takiego paranoika jak ja wolałbym ten
źródło
'/'
powinieneś użyćos.sep
Aby przejść do
n
folderów ... uruchomup(n)
źródło
Oczywiście: po prostu użyj
os.chdir(..)
.źródło
Za pomocą
os.path
możemy przejść o jeden katalog wyżejtakże po znalezieniu żądanego katalogu możesz dołączyć do innej ścieżki do pliku / katalogu
źródło