django project root self discovery

Solution 1:

The architecture of a project in Django

  • root/

    • app1/
    • app2/
    • ...
    • main/
      • settings.py

Inside settings.py:

SITE_ROOT = os.path.dirname(os.path.realpath(__file__)) -> gives the path of the file settings.py: root/main/. This is NOT THE ROOT OF THE PROJECT

PROJECT_PATH = os.path.abspath(os.path.dirname(__name__)) -> gives the root of the project: root/. This is THE ROOT OF THE PROJECT.

Solution 2:

Django 1.8 already includes the project root directory as BASE_DIR:

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

And you can use it in your app by importing settings:

from django.conf import settings
...
...
print(settings.BASE_DIR)

Solution 3:

Grab the __file__ global, and use the various functions in os.path on it.

import os.path
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))

Solution 4:

PROJECT_PATH = os.path.abspath(os.path.dirname(__name__))