Django 3.1 now uses the Python pathlib module for its internal paths. This change caught me off guard when I started developing with it, as I was used to the old os.path way of doing things. Here's a look at the old way and its newer counterpart:
# Old way import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # New way from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent
Joining paths together uses a very different mechanism as well:
# Old way STATIC_ROOT = os.path.join(BASE_DIR, 'static') # New way STATIC_ROOT = BASE_DIR / 'static' # Alternate new way (which I prefer) STATIC_ROOT = BASE_DIR.joinpath('static')
These new mechanisms feel so different since they treat paths as objects, not strings. This works well, however, since paths aren't really strings in the first place. Transitioning to this new way of thinking is taking me some time, since prior to this module, every path in Python was treated as a string. However, I can already see the utility of this module, especially when it comes to resolving relative paths.