Настройки фреймворка 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'),
}
}
...