2010-03-01 29 views
7

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

4

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.

+0

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

+2

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. –

+0

@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

2

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.

1

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

0

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