Как установить статический корень и медиа-корень, чтобы используемый путь не был жестко закодирован?


В моем settings.py файл как STATIC_ROOT, так и MEDIA_ROOT в настоящее время указывают на жестко закодированное местоположение. Например, путь STATIC_ROOT таков:

/home/ian/projectname/mysite/appname/static
Я знаю, что это вызовет проблемы при развертывании моего проекта. Оглядываясь вокруг, я вижу, что мне нужно использовать os.path, но бесчисленные примеры просто смутили меня.

Я попытался просмотреть различные перестановки установки этого файла (или получение значения примера, используемого для установки BASE_DIR), однако в качестве снимка экрана показывает, что мне чего-то не хватает, потому что он жалуется на значение file.

В случае необходимости я использую Django 1.6

Заранее благодарю.

Введите описание изображения здесь

2 5

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__ доступен только для модуля, нет смысла использовать его на консоли.