Пути Django, разработка в windows, развертывание на linux
Я разрабатываю приложения Django на своей локальной машине windows, а затем развертываю на размещенном сервере linux. Формат для путей отличается между ними и ручной заменой перед развертыванием занимает больше времени, чем должно. Я мог бы кодировать на основе переменной в файле настроек и операторов if, но мне было интересно, есть ли у кого-нибудь лучшие практики для этого сценария.
4 ответов
книга Django предлагает использовать os.path.join
(и использовать слеши вместо обратных косых черт в Windows):
import os.path
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), 'templates').replace('\','/'),
)
Я думаю, что это лучшее решение, так как вы можете легко создавать относительные пути. Если у вас несколько относительных путей, вспомогательная функция сократит код:
def fromRelativePath(*relativeComponents):
return os.path.join(os.path.dirname(__file__), *relativeComponents).replace("\","/")
Если вам нужны абсолютные пути, вы должны использовать переменную окружения (с os.environ["MY_APP_PATH"]
) в сочетании с os.path.join
.
у нас есть ситуация, очень похожая на вашу, и мы использовали разные пути в настройках, основываясь на sys.platform
.
Что-то вроде этого:--3-->
import os, sys
DEVELOPMENT_MODE = sys.platform == 'win32'
if DEVELOPMENT_MODE:
HOME_DIR = 'c:\django-root\'
else:
HOME_DIR = '/home/django-root/'
он работает вполне нормально-предполагается, что все разработки выполняются в Windows.
добавить
import os.path
BASE_PATH = os.path.dirname(__file__)
в верхней части файла настроек, а затем использовать BASE_PATH
везде, где вы хотите использовать путь относительно вашего проекта Django.
например:
MEDIA_ROOT = os.path.join(BASE_PATH, 'media')
(вам нужно использовать ОС.путь.присоединиться(), вместо того, чтобы просто писать что-то вроде MEDIA_ROOT = BASE_PATH+'/media'
, потому что Unix присоединяется к каталогам с помощью '/', в то время как windows предпочитает'\')
в вашем settings.py добавить следующие строки
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