Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django static Files

I am trying to develop a website with Django following various guides, the documentation and google. I have some flat pages set up that need access to images/css files.

My settings.py file looks like this:

# Django settings for FirstBlog project.

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', '[email protected]'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'db',                      # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'America/Chicago'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'

SITE_ID = 3

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = ''

# 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 = ''

# 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 = '/export/mailgrp4_a/sc10jbr/WWWdev/FirstBlog/djangostatic/'

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'

# URL prefix for admin static files -- CSS, JavaScript and images.
# Make sure to use a trailing slash.
# Examples: "http://foo.com/static/admin/", "/static/admin/".
ADMIN_MEDIA_PREFIX = '/static/admin/'

# Additional locations of static files
STATICFILES_DIRS = (
    '/export/mailgrp4_a/sc10jbr/WWWdev/FirstBlog/static/',
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

# 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',
)

# Make this unique, and don't share it with anybody.
SECRET_KEY = 'nc*v+e13e#!b+dq9mh-vwi0smy#r97#by1w7pvc36ez$j%rz1b'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
)

ROOT_URLCONF = 'FirstBlog.urls'

TEMPLATE_DIRS = (
    '/export/mailgrp4_a/sc10jbr/WWWdev/FirstBlog/templates',
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'FirstBlog.blog',
    'django.contrib.flatpages',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    'django.contrib.admindocs',
)

# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
    }
}

I have put my images/css files in FirstBlog/static/images and /css. I ran the command

python manage.py collectstatic

which put all my files in FirstBlog/djangostatic.

I am trying to access the image from my flatpage index.html using the tag:

src="{{ /static/ }}images/header.png"

I have included this line in my urls.py file:

url(r'^static/(.*)$', 'django.views.static.serve', {'document_root':settings.STATIC_PATH}),

This is giving me the following error:

Name Error at /static

name 'settings' is not defined

Request Method:     GET
Request URL:    http://127.0.0.1:8000/static
Django Version:     1.3.1
Exception Type:     NameError
Exception Value:    

name 'settings' is not defined

Exception Location:     /home/cserv2_a/soc_ug/sc10jbr/WWWdev/FirstBlog/../FirstBlog/urls.py in <module>, line 19

Im sorry if this should be obvious, I've spent hours looking on the internet.

Thanks in advance

like image 916
Joseph Roberts Avatar asked Nov 28 '22 03:11

Joseph Roberts


2 Answers

Django is an fantastic system. Feature rich and yet still simple, elegant & extremely well documented, with excellent examples.....for everything EXCEPT static content. We struggle with this on every new Django project. But we recently solved this, in what we believe is the "recommended" way.

The key bit of knowledge to keep in mind is that Django does not want to directly serve static content. It would prefer you offload this to the underlying webserver (such as Apache). There are ways to force Django to serve it for you -- and you might even think it's a good idea to have all serving done in one common platform. But take my word for it -- you'll regret this later, and wish you'd just followed the Django recommendation on this one.

Short story:

These settings go in 'settings.py'

Set STATIC_ROOT to the full file system path to where you wish to keep your static content. I recommend somewhere outside of your regular web-application directories. Remember, Apache will serve this directly and you don't want to open a security issue under your feet.

Set STATIC_ROOT = '/usr/local/static/MyProject/' # include trailing slash

Set STATIC_URL = '/static/' # no reason to get too fancy with this

Set ADMIN_MEDIA_PREFIX = '/static/admin/' # don't forget this one

Make sure the default STATICFILES_FINDERS is set:

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    )

And make sure that the INSTALLED_APPS setting includes 'django.contrib.staticfiles'

And make sure that TEMPLATE_CONTEXT_PROCESSORS includes 'django.core.context_processors.static'

---- NEXT ----

You will want to configure Apache to server the static content directly. From within your VirtualHost stanza, add something like this:

Alias /static/  /usr/local/static/MyProject/

NOTE: replace the path above with the same path you used when you set STATIC_ROOT

---- NEXT ----

In each application folder, anything you want to get added to your STATIC_ROOT collect into a sub-folder called 'static/'. For example, if you had an app called 'controller', you should have a path that looks like 'controller/static'

Then from the top of your Django project folder, run the 'collectstatic' sub-command of manage.py. We typically create a script and run it thusly:

#!/usr/bin/sh
# Scrtipt to collect django static files together.
#
# --link    Create a symbolic link to each file instead of copying.
# --noinput Do NOT prompt the user for input of any kind.
#
python manage.py collectstatic -link --noinput
exit 0

That's it

You do NOT need to make any entries in urls.py -- Django will never get to see these requests, so there's no point adding routing entries.

Downside

The one big downside to the approach outlined above, it defeats using the Django testserver app. We never use this for any of work, and since our end result will always be published to Apache, we find it's better to only develop there. If you rely on 'testserver' -- there are ways around this limitation. But you'll need to dig through the Django docs a bit https://docs.djangoproject.com/en/dev/howto/static-files/

Good luck

like image 98
user590028 Avatar answered Dec 06 '22 18:12

user590028


Please check if the settings module is imported in urls.py

like image 30
Sivasubramaniam Arunachalam Avatar answered Dec 06 '22 18:12

Sivasubramaniam Arunachalam