#35291: 500 Server error. Whitenoise Not Working when DEBUG = FALSE - Django - Hosting Static Files -------------------------------------+------------------------------------- Reporter: Shihab | Owner: (none) Khan | Type: Bug | Status: assigned Component: | Version: 4.2 Uncategorized | Keywords: 500 Server error, Severity: Normal | Whitenoise, DEBUG = FALSE Triage Stage: | Has patch: 0 Unreviewed | Needs documentation: 0 | Needs tests: 0 Patch needs improvement: 0 | Easy pickings: 0 UI/UX: 0 | -------------------------------------+------------------------------------- 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.
settings.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) }}} -- Ticket URL: <https://code.djangoproject.com/ticket/35291> 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/0107018e31f59774-583d17b8-710f-4374-8c9b-6b24a43d1837-000000%40eu-central-1.amazonses.com.