django application static files not working in production

Question:

static files are not working in production even for the admin page.

I have not added any static files.

I am having issues with my admin page style.

I have followed the below tutorial to create the django application.

https://tutorial.djangogirls.org/en/

below is my settings.py

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = '##############################'

# SECURITY WARNING: don't run with debug turned on in production! DEBUG = True

ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com']


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog', ]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware', ]

ROOT_URLCONF = 'new_p.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    }, ]

WSGI_APPLICATION = 'new_p.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    } }


# Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    }, ]


# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/

STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static')

I have already run collectstatic in production.

(master)$ python3 manage.py collectstatic

You have requested to collect static files at the destination location as specified in your settings:

    /home/ag/ag.pythonanywhere.com/new_p/static

This will overwrite existing files! Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: yes

0 static files copied to '/home/agusm/agusm.pythonanywhere.com/new_p/static', 119 unmodified.
Asked By: Okay

||

Answers:

The basic outline of putting static files into production is simple run the collectstatic command

you need to configure your web server to serve the files in STATIC_ROOT under the URL STATIC_URL

refer this link

Answered By: rahul.m

Here is what you need

When collectstatic is run, the default STATICFILES_FINDERS value django.contrib.staticfiles.finders.FileSystemFinder will collect your static files from any paths that you have in STATICFILES_DIRS.

The other default STATICFILES_FINDERS value django.contrib.staticfiles.finders.AppDirectoriesFinder will look in the /static/ folder of any apps in your INSTALLED_APPS.

All of the static files that are found will be placed in the specified STATIC_ROOT directory.

$ python manage.py collectstatic

This will copy all files from your static folders into the STATIC_ROOT directory.

You can also use

python manage.py findstatic

to see which directories collectstatic will look in.

Answered By: Iakovos Belonias

If you use nginx you need this in your config

server{
...
    location /static/ {
        alias /path/to/static/;
        ...
    }
...
}

For apache like this

<VirtualHost *:80>
...
Alias /static "/path/to/static/"  
<Directory "/path/to/static">  
    Order allow,deny
    Allow from all 
</Directory>
</VirtualHost>
Answered By: pfitzer

I think your settings and the way you run collectstatic is fine.

If you are hosting on pythonanywhere, which I assume you are based on your ALLOWED_HOSTS, you need to follow this guide:

Set up a static files mapping

Finally, set up a static files mapping to get our web servers to serve out your static files for you.

Go to the Web tab on the PythonAnywhere dashboard
Go to the Static Files section
Enter the same URL as STATIC_URL in the url section (typically, /static/)
Enter the path from STATIC_ROOT into the path section (the full path, including /home/username/etc)

Then hit Reload and test your static file mapping by going to retrieve a known static file.

Eg, if you have a file at /home/myusername/myproject/static/css/base.css, go visit http://www.your-domain.com/static/css/base.css

This is basically what you would do manually by setting up your webserver (nginx/apache as in pfitzer’s answer), but I assume it’s doing the same process of setting a directory alias via pythonanywhere’s web interface instead.

Answered By: Geekfish

paste these text in the settings.py file

STATIC_URL = '/static/'
STATICFILES_DIRS=[os.path.join(BASE_DIR,"static"), "templates"]

MEDIA_URL="static/media/"
MEDIA_ROOT=os.path.join(BASE_DIR,"static/media/")

then paste {% load static %} in the html file where you want to use the static files or media

then use <img src="{% static 'media/images/mandeep.jpeg' %}" alt="My image"> for images

and for css link use <link rel="stylesheet" href="{% static '/css/style.css' %}">

feel free to ask any question

Answered By: Mandeep singh

The main problem is in urls.py of the project you have created i also figured it out and the solution that worked for me was :
it works as default settings of django does not include the static and media path if DEBUG = False

urls.py :

urlpatterns = [
    path('', include('<app_name>.urls')),   
]
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

if settings.DEBUG:
 urlpatterns += path('admin/', admin.site.urls)

settings.py:

STATIC_URL = 'Assets/'
STATIC_ROOT = BASE_DIR / 'staticfiles_build' / 'Assets'
STATICFILES_DIRS = [
    BASE_DIR / "Assets",
]

Assets is the folder name where my static files are present, it can be static in you r case

Answered By: Dhruv kejriwal
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.