django application static files not working in production
Asked Answered
G

6

7

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.
Genoese answered 28/3, 2019 at 12:56 Comment(8)
did you use collectstatic? what web server are you using to host the django project?Psychological
yes i have already run collectstaticGenoese
did you configure your web server to point /static to the folder where collectstatic put the files?Psychological
Django doesn’t serve files itself; it leaves that job to whichever Web server you choose.Peace
i havent added any static files now. my admin page static files are not loadingGenoese
@Genoese can you show settings.py codePeace
yes i will share it nowGenoese
@c.grey added settings.py, sorry for the delayGenoese
D
6

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.

Deb answered 28/3, 2019 at 14:47 Comment(7)
i dont have any static filesGenoese
The admin css files are static files shipped with Django. So you do have static files, just not your own.Deb
Django is serving my admin OK, just without static files: CSS, JS, etc.Genoese
Yes I understand. Those are static files, collectstatic collects them from django and puts them in a directory so that Django can serve them. I don't understand what else you are asking, did you try the above?Deb
Did you try setting up PythonAnywhere settings as described above?Deb
What are the actual symptoms of your problem? If you open the network tab on your browser, do you get 404s for css/js files? Do the requested paths match your expecations? Also, if you inspect your access logs (on the server), do you see those requests and 404s? Maybe there is some useful information there.Deb
what are the pythonanywhere static mappings that you have setup? and did you reload your webapp after setting up those static mappings?Zoi
I
3

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>
Irremovable answered 28/3, 2019 at 13:57 Comment(1)
autoindex on is not required and might actually not be desired. I would suggest removing it.Deb
E
2

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

Endomorphism answered 23/3, 2023 at 17:50 Comment(0)
P
0

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

Peace answered 28/3, 2019 at 12:59 Comment(0)
H
-2

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.

Heavyduty answered 28/3, 2019 at 13:1 Comment(0)
I
-3

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

Ivette answered 19/6, 2020 at 23:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.