Работа BASE_DIR в Django 3.1 с os и pathlib


15 сентября 2020


Замена os на pathlib в Python Django 3.1 и работа с BASE_DIR

Настройки фреймворка Python Django всегда включали переменную BASE_DIR в settings.py содержащую в себе абсолютный путь до корня проекта. Это переменная часто используется разработчиками для того что бы указать путь до статических файлов (staticfiles_dirs), шаблонов (templates) и других директорий.

До Django 3.1 эта переменная определялась через модуль os:

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

В версии Django 3.1 вместо модуля os стал использоваться pathlib:

from pathlib import Path

BASE_DIR = Path(__file__).resolve(strict=True).parent.parent

В проектах обновленных до Django 3.1 значение этой переменной изменено не будет. Весь список изменений можно посмотреть на github.

Сам модуль pathlib был добавлен в Python 3.4 и имеет более простой интерфейс для разработчика чем модуль os. Так, например, мы определяли статические файлы до версии 3.1:

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

Начиная с версии 3.1, аналогичный мы определим так:

STATICFILES_DIRS = [
    BASE_DIR / 'static',
]

 Пример с базой данных sqllite:

Важно отличие в том, что теперь мы получаем не объект типа строка:

Из-за разных объектов разработчики исправили работу Django в некоторых частях. Посмотреть эти изменения можно в коммите 77aa74cb. Я не встречал ошибок в 3.1 связанных с этими изменениями, но есть рекомендация, при появлении неисправностей, явно преобразовывать объект в строку. Не мой пример, но это может понадобится при работе базы SQLite с настройкой "mode=memory":

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': str(BASE_DIR / 'db.sqlite3'),
    }
}

 

...

Теги: #python #django


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.