6👍
In your settings.py, define the STATIC_
and MEDIA_
values:
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = '/path/to/mydjangosite/media/'
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = 'http://www.mydjangosite.com/media/'
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = '/path/to/mydjangosite/static/'
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = 'http://www.mydjangosite.com/static/'
Also, ensure that the correct STATICFILES_FINDERS
are configured:
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
The AppDirectoriesFinder must be enabled to collect static files from the static/
sub-directory within each app. Additionally, ensure that your apps are included in the INSTALLED_APPS
setting or else the AppDirectoriesFinder won’t know where to look for static files:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
# DJANGO SOUTH
'south',
# MY APPS
'my_django_app',
)
Then, to collect static from the various app folders (e.g. my_project/my_app/static) you must invoke the manage.py
command collectstatic
:
python manage.py collectstatic
This moves all the various apps’ static files into the folder specified by STATIC_ROOT
in settings.py
.
Finally, ensure that your static folder is served directly by your web server and not via the Django WSGI application. For Apache2 /etc/apache2/sites-available/my_django_site.conf
:
<VirtualHost *:80>
ServerName www.mydjangosite.com
ServerAlias mydjangosite.com
ServerAdmin fake@mydjangosite.com
DocumentRoot /path/to/mydjangosite
<Directory /path/to/mydjangosite>
Options FollowSymLinks
AllowOverride None
Order allow,deny
allow from all
</Directory>
Alias /static/ /path/to/mydjangosite/static/
<Directory /path/to/mydjangosite/static>
Order allow,deny
allow from all
</Directory>
Alias /media/ /path/to/mydjangosite/media/
<Directory /path/to/mydjangosite/media>
Order allow,deny
allow from all
</Directory>
# The following installs the Django WSGI app
WSGIDaemonProcess www.mydjangosite.com processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup www.mydjangosite.com
WSGIScriptAlias / /path/to/mydjangosite/wsgi.py
</VirtualHost>
An explicit Alias
definition and a Directory
tag for the alias’d directory will override any WSGI application running in a higher-level parent directory.
Execute sudo service apache2 restart
to load the new site.conf configuration.
4👍
Staticfiles in Django is one of the more confusing parts of the framework in my opinion. Django expects you to put static files into a folder that will be served locally during development, but collected to another directory, along with any other static media 3rd party app modules might be using, in production as a result of running manage.py collectstatic
Here is the directory structure that I use, and a helper function to make life a little easier in regards to static files…
# A Sample Project structure
/sample_app
manage.py
/sample_app
# this directory is served by the 'staticfiles' app during development
# as specified by STATICFILES_DIRS for the location of the files
# and a STATIC_URL of '/static/'
/static-assets/
/css
/js
/images
# this directory is where all of the folders and files specified in the
# STATICFILES_DIRS setting get collected to for deployment. The files
# will be collected to the directory specified by the STATIC_ROOT setting.
/static
# settings.py
import os
# a helper function to return absolute paths, using settings.py
# as a starting point. This assumes Django >= 1.4.x
def map_path(directory_name):
return os.path.join(os.path.dirname(__file__),
'../' + directory_name).replace('\\', '/')
MEDIA_ROOT = map_path('static/uploads/')
MEDIA_URL = '/static/uploads/'
STATIC_ROOT = map_path('static')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
map_path('static-assets'),
)
# You can also use map_path for other paths, like templates
TEMPLATE_DIRS = (
map_path('templates),
)
TEMPLATE_CONTEXT_PROCESSORS = (
...
'django.core.context_processors.request',
'django.core.context_processors.static'
...
)
Then you should be able to reference static files in your templates as:
<link type="text/css" rel="stylesheet"
href="{{ STATIC_URL }}css/base.css" media="screen,projection" />
Another potential gotcha is that the staticfiles app only works when DEBUG = True
- [Django]-Best practices: Good idea to create a new table for every user?
- [Django]-Humanize in django/python, how to translate
- [Django]-How to use ListSerializer with a ModelSerializer?
- [Django]-ModuleNotFoundError: No module named 'debug_toolbar' Django 3.1
- [Django]-Json.parse gives Uncaught SyntaxError: Unexpected Token (Django json serialized queryset)