#35290: 500 Server error. Whitenoise Not Working when DEBUG = FALSE - Django -
Hosting Static Files
-------------------------------------+-------------------------------------
     Reporter:  Shihab Khan          |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  contrib.staticfiles  |                  Version:  4.2
     Severity:  Normal               |               Resolution:
     Keywords:  500 Server error,    |             Triage Stage:
  Whitenoise,  DEBUG = FALSE         |  Unreviewed
    Has patch:  1                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by Shihab Khan:

Old description:

> I am running a Django website and it's about to go into production. I am
> now at the point where I need to set DEBUG = False in my settings.py
> file. I am getting the typical 500 errors because I have static files
> that are being hosted locally. I am working on getting Whitenoise to work
> to host my static files so I can move on with DEBUG = False. I have
> followed a lot of documentation and a lot of tutorials and think all of
> my configurations are all set but I am still getting the same error. When
> DEBUG = False I am still getting 500 errors on my production pages that
> have static files. Also when I inspect any static files on the page when
> DEBUG = True the URL has not changed at all. I am posting all of my
> configuration below in hopes that there is a simple mistake I made that I
> have been continuously skipped over but Whitenoise doesn't seem to be
> working and there seems to be no different from the way it was before now
> as Whitenoise is "implemented".
>
> I have run python manage.py collect static
>
> I have run pip install whitenoise
>
> I am new to white noise so I am just basing my knowledge on the tutorials
> and documentation I have found.
>

>

> setting.py
> from pathlib import Path
> import os
>
> # Build paths inside the project like this: BASE_DIR / 'subdir'.
> BASE_DIR = Path(__file__).resolve().parent.parent
>
> def load_env():
>     env_file = os.path.join(BASE_DIR, '.env')
>     if os.path.exists(env_file):
>         with open(env_file, 'r') as file:
>             for line in file:
>                 line = line.strip()
>                 if line and not line.startswith("#"):
>                     key, value = line.split('=')
>                     os.environ[key] = value
>
> # Load environment variables from the .env file
> load_env()
>
> # Quick-start development settings - unsuitable for production
> # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
>
> # SECURITY WARNING: keep the secret key used in production secret!
> SECRET_KEY = 'django-
> insecure-x=qe5@^3%@t1fk)pk@uyv&r!z^#9==^*-&aiqfau3@9x@+j%nm'
>
> # SECURITY WARNING: don't run with debug turned on in production!
> DEBUG = True if os.getenv('DEBUG') == 'True' else False
>
> ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS').split(',')
>

> # Application definition
>
> INSTALLED_APPS = [
>     'django.contrib.admin',
>     'django.contrib.auth',
>     'django.contrib.contenttypes',
>     'django.contrib.sessions',
>     'django.contrib.messages',
>     'django.contrib.staticfiles',
>     'accounts',
>     'home',
>     'about',
>     'pricing',
>     'blog',
>     'contact',
>     'service',
>     'project',
>     'settings',
>     'legal',
>     'menus',
>     'adminapp',
>     'marketing',
>     'custompage',
>     'ckeditor',
> ]
>
> 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',
> ]
>
> if os.getenv('DEMO_MODE') == 'True':
>     MIDDLEWARE.append('core.middleware.middleware.DemoModeMiddleware')
>
> if os.getenv("WHITENOISE_CONFIG") == "True":
>     MIDDLEWARE.insert(1, 'whitenoise.middleware.WhiteNoiseMiddleware')
>

> ROOT_URLCONF = 'core.urls'
>
> TEMPLATES = [
>     {
>         'BACKEND': 'django.template.backends.django.DjangoTemplates',
>         'DIRS': [os.path.join(BASE_DIR, os.getenv('TEMPLATES_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',
>                 'core.context_processors.website_settings_context',
>                 'core.context_processors.seo_settings_context',
>                 'core.context_processors.header_footer_context',
>                 'core.context_processors.menu_data',
>                 'core.context_processors.user_profile_context',
>                 'core.context_processors.service_context',
>                 'core.context_processors.project_context',
>                 'core.context_processors.demo_mode_enabled',
>             ],
>         },
>     },
> ]
>
> WSGI_APPLICATION = 'core.wsgi.application'
>

> # Database
> # https://docs.djangoproject.com/en/4.2/ref/settings/#databases
>
> # First install my sql client using - pip install mysqlclient
> if os.getenv('MYSQL_DB') == 'True':
>     DATABASES = {
>         'default': {
>             'ENGINE': 'django.db.backends.mysql',
>             'NAME': os.getenv('DB_NAME'),
>             'USER': os.getenv('DB_USER'),
>             'PASSWORD': os.getenv('DB_PASSWORD'),
>             'HOST': os.getenv('DB_HOST'),
>             'PORT': os.getenv('DB_PORT'),
>         }
>     }
> else:
>     DATABASES = {
>     'default': {
>         'ENGINE': 'django.db.backends.sqlite3',
>         'NAME': BASE_DIR / 'db.sqlite3',
>             }
>     }
> # Email Setup
> EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
> EMAIL_HOST = os.getenv('EMAIL_HOST')
> EMAIL_PORT = os.getenv('EMAIL_PORT')
> EMAIL_USE_TLS = os.getenv('EMAIL_USE_TLS')
> EMAIL_HOST_USER = os.getenv('EMAIL_HOST_USER')
> EMAIL_HOST_PASSWORD = os.getenv('EMAIL_HOST_PASSWORD')
>
> # Password validation
> # https://docs.djangoproject.com/en/4.2/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/4.2/topics/i18n/
>
> LANGUAGE_CODE = 'en-us'
>
> TIME_ZONE = os.getenv('TIME_ZONE')
>
> USE_I18N = True
>
> USE_TZ = True
>

> # Static files (CSS, JavaScript, Images)
> # https://docs.djangoproject.com/en/4.2/howto/static-files/
>
> STATIC_URL = os.getenv('STATIC_URL')
> STATICFILES_DIRS = [os.path.join(BASE_DIR,
> str(os.getenv('STATICFILES_DIRS')))]
> STATIC_ROOT = os.path.join(BASE_DIR, str(os.getenv('STATIC_ROOT')))
> MEDIA_URL = str(os.getenv('MEDIA_URL'))
> MEDIA_ROOT = os.path.join(BASE_DIR, str(os.getenv('MEDIA_ROOT')))
>
> # Default primary key field type
> # https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
>
> DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
>
> AUTH_USER_MODEL = 'accounts.User'
>
> # white noise settings
> if os.getenv('WHITENOISE_CONFIG') == 'True':
>     STORAGES = {
>          "default": {
>         "BACKEND": "django.core.files.storage.FileSystemStorage",
>     },
>         "staticfiles": {
>               "BACKEND":
> "whitenoise.storage.CompressedManifestStaticFilesStorage",
>          },
>     }
>

> urls.py
>
> from django.contrib import admin
> from django.urls import path ,include
> from django.conf import settings
> from django.conf.urls.static import static
> from django.views.generic import RedirectView
> from core.sitemaps import generate_sitemap
> from django.urls import re_path
> from django.views.static import serve
>
> urlpatterns = [
>     path('oldadmin/', admin.site.urls),
>     path('admin/' , RedirectView.as_view(pattern_name="adminHome"),
> name='adminRedirect'),
>     path('dashboard/' , RedirectView.as_view(pattern_name="adminHome"),
> name='adminRedirect2'),
>     path('', include('adminapp.urls')),
>     path('', include('accounts.urls')),
>     path('', include('home.urls')),
>     path('', include('about.urls')),
>     path('', include('pricing.urls')),
>     path('', include('blog.urls')),
>     path('', include('contact.urls')),
>     path('', include('service.urls')),
>     path('', include('project.urls')),
>     path('', include('legal.urls')),
>     path('', include('marketing.urls')),
>     path('', include('custompage.urls')),
>     path('sitemap.xml', generate_sitemap, name='generate_sitemap'),
> ]
>
> handler404 = 'accounts.views.error_404'
> handler404 = 'adminapp.views.error_404'
> handler404 = 'home.views.error_404'
> handler404 = 'service.views.error_404'
> handler404 = 'project.views.error_404'
> handler404 = 'contact.views.error_404'
> handler404 = 'about.views.error_404'
> handler404 = 'blog.views.error_404'
> handler404 = 'settings.views.error_404'
> handler404 = 'legal.views.error_404'
>
> handler500 = 'adminapp.views.error_500'
>
> urlpatterns += static(settings.MEDIA_URL,
> document_root=settings.MEDIA_ROOT)

New description:

 I am running a Django website and it's about to go into production. I am
 now at the point where I need to set DEBUG = False in my settings.py file.
 I am getting the typical 500 errors because I have static files that are
 being hosted locally. I am working on getting Whitenoise to work to host
 my static files so I can move on with DEBUG = False. I have followed a lot
 of documentation and a lot of tutorials and think all of my configurations
 are all set but I am still getting the same error. When DEBUG = False I am
 still getting 500 errors on my production pages that have static files.
 Also when I inspect any static files on the page when DEBUG = True the URL
 has not changed at all. I am posting all of my configuration below in
 hopes that there is a simple mistake I made that I have been continuously
 skipped over but Whitenoise doesn't seem to be working and there seems to
 be no different from the way it was before now as Whitenoise is
 "implemented".

 I have run python manage.py collect static

 I have run pip install whitenoise

 I am new to white noise so I am just basing my knowledge on the tutorials
 and documentation I have found.




 setting.py

 {{{
 from pathlib import Path
 import os

 # Build paths inside the project like this: BASE_DIR / 'subdir'.
 BASE_DIR = Path(__file__).resolve().parent.parent

 def load_env():
     env_file = os.path.join(BASE_DIR, '.env')
     if os.path.exists(env_file):
         with open(env_file, 'r') as file:
             for line in file:
                 line = line.strip()
                 if line and not line.startswith("#"):
                     key, value = line.split('=')
                     os.environ[key] = value

 # Load environment variables from the .env file
 load_env()

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

 # SECURITY WARNING: keep the secret key used in production secret!
 SECRET_KEY = 'django-
 insecure-x=qe5@^3%@t1fk)pk@uyv&r!z^#9==^*-&aiqfau3@9x@+j%nm'

 # SECURITY WARNING: don't run with debug turned on in production!
 DEBUG = True if os.getenv('DEBUG') == 'True' else False

 ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS').split(',')


 # Application definition

 INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'accounts',
     'home',
     'about',
     'pricing',
     'blog',
     'contact',
     'service',
     'project',
     'settings',
     'legal',
     'menus',
     'adminapp',
     'marketing',
     'custompage',
     'ckeditor',
 ]

 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',
 ]

 if os.getenv('DEMO_MODE') == 'True':
     MIDDLEWARE.append('core.middleware.middleware.DemoModeMiddleware')

 if os.getenv("WHITENOISE_CONFIG") == "True":
     MIDDLEWARE.insert(1, 'whitenoise.middleware.WhiteNoiseMiddleware')


 ROOT_URLCONF = 'core.urls'

 TEMPLATES = [
     {
         'BACKEND': 'django.template.backends.django.DjangoTemplates',
         'DIRS': [os.path.join(BASE_DIR, os.getenv('TEMPLATES_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',
                 'core.context_processors.website_settings_context',
                 'core.context_processors.seo_settings_context',
                 'core.context_processors.header_footer_context',
                 'core.context_processors.menu_data',
                 'core.context_processors.user_profile_context',
                 'core.context_processors.service_context',
                 'core.context_processors.project_context',
                 'core.context_processors.demo_mode_enabled',
             ],
         },
     },
 ]

 WSGI_APPLICATION = 'core.wsgi.application'


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

 # First install my sql client using - pip install mysqlclient
 if os.getenv('MYSQL_DB') == 'True':
     DATABASES = {
         'default': {
             'ENGINE': 'django.db.backends.mysql',
             'NAME': os.getenv('DB_NAME'),
             'USER': os.getenv('DB_USER'),
             'PASSWORD': os.getenv('DB_PASSWORD'),
             'HOST': os.getenv('DB_HOST'),
             'PORT': os.getenv('DB_PORT'),
         }
     }
 else:
     DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.sqlite3',
         'NAME': BASE_DIR / 'db.sqlite3',
             }
     }
 # Email Setup
 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
 EMAIL_HOST = os.getenv('EMAIL_HOST')
 EMAIL_PORT = os.getenv('EMAIL_PORT')
 EMAIL_USE_TLS = os.getenv('EMAIL_USE_TLS')
 EMAIL_HOST_USER = os.getenv('EMAIL_HOST_USER')
 EMAIL_HOST_PASSWORD = os.getenv('EMAIL_HOST_PASSWORD')

 # Password validation
 # https://docs.djangoproject.com/en/4.2/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/4.2/topics/i18n/

 LANGUAGE_CODE = 'en-us'

 TIME_ZONE = os.getenv('TIME_ZONE')

 USE_I18N = True

 USE_TZ = True


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

 STATIC_URL = os.getenv('STATIC_URL')
 STATICFILES_DIRS = [os.path.join(BASE_DIR,
 str(os.getenv('STATICFILES_DIRS')))]
 STATIC_ROOT = os.path.join(BASE_DIR, str(os.getenv('STATIC_ROOT')))
 MEDIA_URL = str(os.getenv('MEDIA_URL'))
 MEDIA_ROOT = os.path.join(BASE_DIR, str(os.getenv('MEDIA_ROOT')))

 # Default primary key field type
 # https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field

 DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

 AUTH_USER_MODEL = 'accounts.User'

 # white noise settings
 if os.getenv('WHITENOISE_CONFIG') == 'True':
     STORAGES = {
          "default": {
         "BACKEND": "django.core.files.storage.FileSystemStorage",
     },
         "staticfiles": {
               "BACKEND":
 "whitenoise.storage.CompressedManifestStaticFilesStorage",
          },
     }
 }}}



 urls.py


 {{{
 from django.contrib import admin
 from django.urls import path ,include
 from django.conf import settings
 from django.conf.urls.static import static
 from django.views.generic import RedirectView
 from core.sitemaps import generate_sitemap
 from django.urls import re_path
 from django.views.static import serve

 urlpatterns = [
     path('oldadmin/', admin.site.urls),
     path('admin/' , RedirectView.as_view(pattern_name="adminHome"),
 name='adminRedirect'),
     path('dashboard/' , RedirectView.as_view(pattern_name="adminHome"),
 name='adminRedirect2'),
     path('', include('adminapp.urls')),
     path('', include('accounts.urls')),
     path('', include('home.urls')),
     path('', include('about.urls')),
     path('', include('pricing.urls')),
     path('', include('blog.urls')),
     path('', include('contact.urls')),
     path('', include('service.urls')),
     path('', include('project.urls')),
     path('', include('legal.urls')),
     path('', include('marketing.urls')),
     path('', include('custompage.urls')),
     path('sitemap.xml', generate_sitemap, name='generate_sitemap'),
 ]

 handler404 = 'accounts.views.error_404'
 handler404 = 'adminapp.views.error_404'
 handler404 = 'home.views.error_404'
 handler404 = 'service.views.error_404'
 handler404 = 'project.views.error_404'
 handler404 = 'contact.views.error_404'
 handler404 = 'about.views.error_404'
 handler404 = 'blog.views.error_404'
 handler404 = 'settings.views.error_404'
 handler404 = 'legal.views.error_404'

 handler500 = 'adminapp.views.error_500'

 urlpatterns += static(settings.MEDIA_URL,
 document_root=settings.MEDIA_ROOT)

 }}}

 python manage.py collectstatic    command


 {{{
 (venv) PS C:\Users\intevers\Downloads\django\intevers> python manage.py
 collectstatic

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

     C:\Users\intevers\Downloads\django\intevers\assets

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

 Type 'yes' to continue, or 'no' to cancel: yes
 Post-processing 'admin\assets\css\vendors\icon\font-awesome\all.min.css'
 failed!

 Traceback (most recent call last):
   File "C:\Users\intevers\Downloads\django\intevers\manage.py", line 22,
 in <module>
     main()
   File "C:\Users\intevers\Downloads\django\intevers\manage.py", line 18,
 in main
     execute_from_command_line(sys.argv)
   File "C:\Users\intevers\Downloads\django\intevers\venv\lib\site-
 packages\django\core\management\__init__.py", line 442, in
 execute_from_command_line
     utility.execute()
   File "C:\Users\intevers\Downloads\django\intevers\venv\lib\site-
 packages\django\core\management\__init__.py", line 436, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "C:\Users\intevers\Downloads\django\intevers\venv\lib\site-
 packages\django\core\management\base.py", line 412, in run_from_argv
     self.execute(*args, **cmd_options)
   File "C:\Users\intevers\Downloads\django\intevers\venv\lib\site-
 packages\django\core\management\base.py", line 458, in execute
     output = self.handle(*args, **options)
   File "C:\Users\intevers\Downloads\django\intevers\venv\lib\site-
 packages\django\contrib\staticfiles\management\commands\collectstatic.py",
 line 209, in hand
 le
     collected = self.collect()
   File "C:\Users\intevers\Downloads\django\intevers\venv\lib\site-
 packages\django\contrib\staticfiles\management\commands\collectstatic.py",
 line 154, in coll
 ect
     raise processed
 whitenoise.storage.MissingFileError: The file
 'admin/assets/css/vendors/icon/webfonts/fa-brands-400.woff2' could not be
 found with <whitenoise.storage.Compres
 sedManifestStaticFilesStorage object at 0x000002243C1053C0>.

 The CSS file 'admin\assets\css\vendors\icon\font-awesome\all.min.css'
 references a file which could not be found:
   admin/assets/css/vendors/icon/webfonts/fa-brands-400.woff2

 Please check the URL references in this CSS file, particularly any
 relative paths which might be pointing to the wrong location.
 }}}

--
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35290#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018e32089945-a7f83f67-fe5f-4ec3-b818-19132f409d66-000000%40eu-central-1.amazonses.com.

Reply via email to