What is the absolute path of BASE DIR?
Question:
Django newbie here. I have trouble understanding the meaning of:
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
and
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static')
STATICFILES_DIRS = (
os.path.join(os.path.dirname(BASE_DIR), "static", "static"),
)
What’s happening here?
I take it the “file” is the settings.py file we are in (?), so the BASE_Dir is two folders up from that…? i.e. the one with manage.py in it?
So the STATIC_ROOT, will be one? or two? directories up from the BASE_DIR. Will the STATIC_ROOT FOLDER be made for me? Or do I have to make one called “static”?
└── MY_PROJECT
├── BASE_DIR
│ ├── MY_APP
│ │ └── settings.py
│ └── manage.py
└── static
Is the above right for this example? Then what the heck / where the heck will the STATIC_FILES_DIRS be?
Answers:
If your settings.py is configured like this, your filesystem looks like this:
└── MY_PROJECT
├── BASE_DIR
│ ├── MY_APP
│ │ └── settings.py
│ └── manage.py
└── static -> STATIC_ROOT
└── static -> STATICFILES_DIRS
But it is not a good configuration because it mixes up collected statics and the directory where Django tries to find static files (e. g. to collect them). May be better to use this:
└── MY_PROJECT
└── BASE_DIR
├── my_app
│ ├── settings.py
│ └── static -> STATICFILES_DIRS
├── manage.py
└── deployment
├── collected_static -> STATIC_ROOT
└── media -> MEDIA_ROOT
# settings.py
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
STATICFILES_DIRS = (os.path.join(
BASE_DIR, "my_app", "static"),)
STATIC_ROOT = os.path.join(
os.path.dirname(BASE_DIR), "deployment", "collected_static")
MEDIA_ROOT = os.path.join(
os.path.dirname(BASE_DIR), "deployment", "media")
Now you can easily deploy your static and media files using your favorite webserver (Apache, Nginx etc.) pointing it to the “deployment” directory.
Update:
I added also a recommendable configuration for MEDIA_ROOT and changed the path for the collected static.
If you want to know where is located BASE_DIR, you can print it to the terminal, just add this line to your settings.py:
print "base dir path", BASE_DIR
and runserver to see results.
BASE_DIR is your Django project directory. The same directory where manage.py is located.
for path settings in django projects i use
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_PRODUCTION_DIR = os.path.abspath(os.path.join(
os.path.dirname(__file__), '..', '..', 'static_production'))
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(STATIC_PRODUCTION_DIR, "static")
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(STATIC_PRODUCTION_DIR, "media")
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
What I did and that really helped me was :
-
go to settings.py and add –> STATICFILES_DIRS = [os.path.join(BASE_DIR, ‘static’)] at the end of file.
-
Go to the base html template in your templates folder, and add these 2 lines in the head section (Just make sure you create a folder in static. in my case it is css as you can see below, could be different name ):
a){% load static %}
b)
if anything contains path in it that you didn’t understand where is it or how it works just type in the bottom of your file print('my directory', UNKNOWN_DIR)
then run in Terminal Python manage.py runserver
.
'my directory'
is just a string you can type in any string then UNKNOWN_DIR
is what you wanna know where is it. then run Python manage.py runserver
.
EXEMPLES:
print(‘my path’, (os.path.abspath(file)) )
python manage.py runserver
print(‘my path’, (os.path.dirname(os.path.abspath(file))) )
python manage.py runserver
print(‘my path’, os.path.join(BASE_DIR, ‘staticfiles’) )
python manage.py runserver
This answer was written for Python 3 and Django 3.x.
It is common to set up a Django project for dev
, prod
and perhaps test
settings. These settings usually inherit from base
settings, which are defined in a file called your_app_name/settings/base.py
. Within base.py
, BASE_DIR
might be defined like this:
BASE_DIR = Path(__file__).resolve().parent.parent.parent
The manage.py shell
subcommand accepts a line to be interpreted by using the -c
option.
Here is a one-line solution that displays BASE_DIR
for a Django app called frobshop
:
$ ./manage.py shell -c 'from frobshop.settings import base; print(f"BASE_DIR={base.BASE_DIR}")'
BASE_DIR=/var/work/django/frobshop
I provide additional information in my Django Notes blog page.
Add this code below to "settings.py" so that you can see the absolute path of "BASE_DIR" on your console:
# "settings.py"
print("BASE_DIR is", BASE_DIR)
Django newbie here. I have trouble understanding the meaning of:
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
and
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static')
STATICFILES_DIRS = (
os.path.join(os.path.dirname(BASE_DIR), "static", "static"),
)
What’s happening here?
I take it the “file” is the settings.py file we are in (?), so the BASE_Dir is two folders up from that…? i.e. the one with manage.py in it?
So the STATIC_ROOT, will be one? or two? directories up from the BASE_DIR. Will the STATIC_ROOT FOLDER be made for me? Or do I have to make one called “static”?
└── MY_PROJECT
├── BASE_DIR
│ ├── MY_APP
│ │ └── settings.py
│ └── manage.py
└── static
Is the above right for this example? Then what the heck / where the heck will the STATIC_FILES_DIRS be?
If your settings.py is configured like this, your filesystem looks like this:
└── MY_PROJECT
├── BASE_DIR
│ ├── MY_APP
│ │ └── settings.py
│ └── manage.py
└── static -> STATIC_ROOT
└── static -> STATICFILES_DIRS
But it is not a good configuration because it mixes up collected statics and the directory where Django tries to find static files (e. g. to collect them). May be better to use this:
└── MY_PROJECT
└── BASE_DIR
├── my_app
│ ├── settings.py
│ └── static -> STATICFILES_DIRS
├── manage.py
└── deployment
├── collected_static -> STATIC_ROOT
└── media -> MEDIA_ROOT
# settings.py
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
STATICFILES_DIRS = (os.path.join(
BASE_DIR, "my_app", "static"),)
STATIC_ROOT = os.path.join(
os.path.dirname(BASE_DIR), "deployment", "collected_static")
MEDIA_ROOT = os.path.join(
os.path.dirname(BASE_DIR), "deployment", "media")
Now you can easily deploy your static and media files using your favorite webserver (Apache, Nginx etc.) pointing it to the “deployment” directory.
Update:
I added also a recommendable configuration for MEDIA_ROOT and changed the path for the collected static.
If you want to know where is located BASE_DIR, you can print it to the terminal, just add this line to your settings.py:
print "base dir path", BASE_DIR
and runserver to see results.
BASE_DIR is your Django project directory. The same directory where manage.py is located.
for path settings in django projects i use
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_PRODUCTION_DIR = os.path.abspath(os.path.join(
os.path.dirname(__file__), '..', '..', 'static_production'))
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(STATIC_PRODUCTION_DIR, "static")
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(STATIC_PRODUCTION_DIR, "media")
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
What I did and that really helped me was :
-
go to settings.py and add –> STATICFILES_DIRS = [os.path.join(BASE_DIR, ‘static’)] at the end of file.
-
Go to the base html template in your templates folder, and add these 2 lines in the head section (Just make sure you create a folder in static. in my case it is css as you can see below, could be different name ):
a){% load static %}
b)
if anything contains path in it that you didn’t understand where is it or how it works just type in the bottom of your file print('my directory', UNKNOWN_DIR)
then run in Terminal Python manage.py runserver
.
'my directory'
is just a string you can type in any string then UNKNOWN_DIR
is what you wanna know where is it. then run Python manage.py runserver
.
EXEMPLES:
print(‘my path’, (os.path.abspath(file)) )
python manage.py runserver
print(‘my path’, (os.path.dirname(os.path.abspath(file))) )
python manage.py runserver
print(‘my path’, os.path.join(BASE_DIR, ‘staticfiles’) )
python manage.py runserver
This answer was written for Python 3 and Django 3.x.
It is common to set up a Django project for dev
, prod
and perhaps test
settings. These settings usually inherit from base
settings, which are defined in a file called your_app_name/settings/base.py
. Within base.py
, BASE_DIR
might be defined like this:
BASE_DIR = Path(__file__).resolve().parent.parent.parent
The manage.py shell
subcommand accepts a line to be interpreted by using the -c
option.
Here is a one-line solution that displays BASE_DIR
for a Django app called frobshop
:
$ ./manage.py shell -c 'from frobshop.settings import base; print(f"BASE_DIR={base.BASE_DIR}")'
BASE_DIR=/var/work/django/frobshop
I provide additional information in my Django Notes blog page.
Add this code below to "settings.py" so that you can see the absolute path of "BASE_DIR" on your console:
# "settings.py"
print("BASE_DIR is", BASE_DIR)