Zajmuję się tworzeniem aplikacji Django na moim lokalnym komputerze z systemem Windows, a następnie wdrażam na hostowanym serwerze Linux. Format ścieżek różni się między nimi i ręcznie wymieniany, zanim wdrożenie zajmie więcej czasu niż powinno. Mógłbym kodować na podstawie zmiennej w moim pliku ustawień i instrukcji if, ale zastanawiałem się, czy ktoś ma najlepsze praktyki dla tego scenariusza.Ścieżki Django, rozwijane w Windows, wdrażane na Linuksie
Odpowiedz
książka Django sugeruje użycie os.path.join
(i używać ukośników zamiast ukośniki w systemie Windows):
import os.path
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),
)
Myślę, że to najlepsze rozwiązanie, jak można łatwo tworzyć ścieżki względne w tym stylu. Jeśli masz wiele ścieżek względnych, funkcja pomocnika skraca kod:
def fromRelativePath(*relativeComponents):
return os.path.join(os.path.dirname(__file__), *relativeComponents).replace("\\","/")
Jeśli potrzebujesz ścieżek absolutnych, należy użyć zmiennej środowiskowej (z os.environ["MY_APP_PATH"]
) w połączeniu z os.path.join
.
Mamy sytuację bardzo podobną do Twojej i używamy różnych ścieżek w ustawieniach, na podstawie sys.platform
. coś takiego:
import os, sys
DEVELOPMENT_MODE = sys.platform == 'win32'
if DEVELOPMENT_MODE:
HOME_DIR = 'c:\\django-root\\'
else:
HOME_DIR = '/home/django-root/'
Działa całkiem OK - zakłada wszystko rozwój jest wykonywana w systemie Windows.
Dodaj
import os.path
BASE_PATH = os.path.dirname(__file__)
na górze pliku ustawień, a następnie użyj BASE_PATH
wszędzie chcesz użyć ścieżki względnej do projektu Django.
Na przykład:
MEDIA_ROOT = os.path.join(BASE_PATH, 'media')
(trzeba użyć os.path.join(), zamiast po prostu pisząc coś takiego MEDIA_ROOT = BASE_PATH+'/media'
, ponieważ Unix dołącza do katalogów za pomocą '/', podczas gdy okna preferuje '\')
w settings.py dodać następujące linie
import os.path
SETTINGS_PATH = os.path.abspath(os.path.dirname(__file__))
head, tail = os.path.split(SETTINGS_PATH)
#add some directories to the path
import sys
sys.path.append(os.path.join(head, "apps"))
#do what you want with SETTINGS_PATH
- 1. rozwój wordpress na Linuksie i wdrożenie na serwerze Windows
- 2. Kod działa 2x szybciej na Windows niż na Linuksie
- 3. tchar.h na Linuksie
- 4. Rozwijane Wybór sterowania - Windows 8 Metro - XAML
- 5. Lista plików z absolutnym rekursywnego ścieżki w Linuksie
- 6. Dodaj kodowanie systemu Windows do Eclipse na Linuksie
- 7. Programowanie w Swift na Linuksie
- 8. django uzyskiwanie bezwzględnej ścieżki FileField
- 9. Obsługa wyjątków w Linuksie
- 10. Menu rozwijane Kraj/Stan/Miasto wewnątrz administratora Django w linii
- 11. Kompilacja OpenCL na Linuksie
- 12. Zainstaluj rabbitmqadmin na Linuksie
- 13. Eliksir Laravel na Linuksie
- 14. Programowanie Flash na Linuksie
- 15. pgmagick zainstalować na Linuksie
- 16. Menu rozwijane na pasku czynności
- 17. Menu rozwijane CSS (na prawo)
- 18. Rozwój Bada w Linuksie
- 19. Menu rozwijane Bootstrap na Twitterze
- 20. Buforowanie DNS w Linuksie
- 21. Java Phantomjs zachowuje się inaczej w Windows i Linuksie
- 22. wiąże w WinForms rozwijane
- 23. Problem z skalowalnością serwera C# na Linuksie
- 24. rozwijane pola w RSelenium
- 25. Domyślny język Django i18n bez prefiksów ścieżki
- 26. Google Chrome na Linuksie FrameBuffer
- 27. Hosting usługi WCF na Linuksie
- 28. Równoważnik SetThreadPriority na Linuksie (pthreads)
- 29. kasowanie wyjścia terminalowego na Linuksie
- 30. Skompiluj skrypt Pythona w Linuksie
To jest najlepsza odpowiedź, możesz użyć ukośników w oknach i systemie Linux. Backslashe były największym problemem, jaki miałem. – marr75
Możesz użyć 'posixpath.join()' zamiast 'os.path.join(). Replace()' - sprawia, że twój cel jest jasny: chcesz ścieżki w stylu POSIX niezależnie od systemu operacyjnego. –
@CraigTrader: fajnie jest użyć 'posixpath.join()', ale to nie usunie odwrotnych ukośników, które są już w łączonych komponentach ścieżki (np. Z 'os.path.dirname (__ plik __)'. – dhobbs