Как установить статический корень и медиа-корень, чтобы используемый путь не был жестко закодирован?
В моем settings.py файл как STATIC_ROOT
, так и MEDIA_ROOT
в настоящее время указывают на жестко закодированное местоположение. Например, путь STATIC_ROOT
таков:
/home/ian/projectname/mysite/appname/static
Я знаю, что это вызовет проблемы при развертывании моего проекта.
Оглядываясь вокруг, я вижу, что мне нужно использовать os.path
, но бесчисленные примеры просто смутили меня.
Я попытался просмотреть различные перестановки установки этого файла (или получение значения примера, используемого для установки BASE_DIR), однако в качестве снимка экрана показывает, что мне чего-то не хватает, потому что он жалуется на значение file.
В случае необходимости я использую Django 1.6
Заранее благодарю.
2 ответа:
Во-первых, вы получаете эту ошибку в результате добавления
__file__
в интерактивную оболочку:NameError: name '__file__' is not defined
Оболочка не определяет текущий путь к файлу в
__file__
, поскольку он относится к вашемуfilepath
, в который вы добавили эту строку. Для работы, например, вам нужно будет включить это вfile.py
:os.path.join(os.path.dirname(__file__))
Затем выполните это из командной строки:
python file.py
Это потому, что
__file__
относится к тому, чтоfilepath
изfile.py
есть.В случае
settings.py
, используйте это, чтобы получить корневой каталог вашего проекта Django:BASE_DIR = os.path.dirname(os.path.dirname(__file__))
Затем можно использовать
os.path.join()
для объединения других относительных путей, таких как:STATIC_ROOT = os.path.join(BASE_DIR, 'static') TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')
Для получения дополнительной информации о том, как разместить каталог проекта Django, прочитайте следующее: общие структуры
Обычная практика (предложенная в официальном учебнике django также) состоит в том, чтобы иметь настройку
BASE_DIR
, которая получает текущий рабочий каталог из__file__
:BASE_DIR = os.path.dirname(os.path.abspath(__file__))
Затем с помощью
os.path.join()
строятся другие относительные пути, например:STATIC_ROOT = os.path.join(BASE_DIR, 'static')
Обратите внимание, что
__file__
доступен только для модуля, нет смысла использовать его на консоли.