#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 django-updates+unsubscr...@googlegroups.com.
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