当Debug = False时,Django返回500内部服务器错误而不是index.html页面

4

我在我的Django Web应用程序中遇到了一个问题,当尝试获取index.html文件时,Django返回500错误。仅当Debug = False并且仅在此模板中发生。所有其他模板都能正常渲染而没有错误。

我已经尝试过白噪声设置、favicon.ico错误、检查了所有路由,一切似乎都很好,但我真的找不到错误所在。奇怪的是,这只发生在index.html中。

如果有人能帮忙,我将不胜感激,提前致谢。

settings.py

DEBUG = False
ALLOWED_HOSTS = ['vilytic.herokuapp.com', '127.0.0.1']

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'accounts',
    'comparer',
]

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_RATES': {
        'video_search': '8/day',
        'video_id': '8/day'
    }
}

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    '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',
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        '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',
            ],
        },
    },
]

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

在终端中出现的错误

"GET / HTTP/1.1" 500 145

urls.py

from django.contrib import admin
from django.urls import path, include
from . import views
from django.views.generic.base import RedirectView
from django.conf import settings
from django.contrib.staticfiles.storage import staticfiles_storage

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index, name="index"),
    path('accounts/', include('accounts.urls'), name="accounts"),
    path('comparer/', include('comparer.urls'), name="comparer"),
    path('contact/', views.contact, name="contact"),
    path(
        "favicon.ico",
        RedirectView.as_view(url=staticfiles_storage.url("favicon.ico")),
    ),
]

views.py

from django.shortcuts import render
from django.core.mail import EmailMessage
from django.template.loader import render_to_string
from django.conf import settings


def index(request):
    return render(request, 'index.html')
7个回答

4

这意味着你出现了一个错误,因为 DEBUG = FALSE,它不会显示错误。你可以在 console 中看到错误,或者通过启用 DEBUG 来查看。


1
不一定。我曾经遇到过Whitenoise的这个问题 - 找到问题可能比那更棘手。 - John Kealy
每次我遇到这个错误,我都会启用“DEBUG”来检查错误并修复它。 - D4NieLDev
1
我的意思是,当没有错误时,这个问题可能会发生 - 当我使用whitenoise时,这种情况曾经发生过。 - John Kealy
我也遇到了与whitenoise相关的问题,但这些答案都没有起作用。 - Anthony Aniobi

1

解决方案

我最近遇到了这个问题,我不得不删除

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

并将其替换为

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'

我希望这能有所帮助。 祝你有美好的一天。

1
您可以将STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' 更改为 STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
这样做可以在提供文件时保持压缩,但您会失去静态文件名称的哈希值。
"哈希化"文件名是什么意思? whitenoise.storage.CompressedManifestStaticFilesStorage 的作用是在collectstatic 方法期间将静态文件另存为具有唯一哈希名称的附加文件,并将其保存到您的STATIC_ROOT 目录中。
当您使用 whitenoise 提供静态文件时,它会在浏览器中缓存文件,并默认设置 Cache-Control 为 4 小时。这意味着您的页面访问者在首次访问您的站点时获取静态文件,如果他们在此 4 小时内再次访问,则会使用静态文件的缓存版本。这会导致页面加载速度更快。
您可以将此缓存控件设置为更长时间(例如 1 年),但这意味着如果用户在其浏览器中仍然拥有静态文件的缓存版本,则对静态文件进行任何更新都不会对用户可见。
Django 提供了一种解决方法:使用ManifestStaticFilesStorage。它使用生成的哈希文件名保存文件,只有在更新文件时才会更改。Whitenoise 将这些文件视为新文件,并在更改它们时更新浏览器缓存。基本上您可以同时拥有更长的 Cache-Control 和更新后用户浏览器获取新文件。
出于某种原因,Django 无法读取您的哈希文件名。这与 whitenoise 关系不大,而是一个 Django "django.contrib.staticfiles.storage.ManifestStaticFilesStorage" 的问题。先尝试在没有 whitenoise 的情况下使其正常工作,然后找出为什么 "django.contrib.staticfiles.storage.ManifestStaticFilesStorage" 抛出了 500 服务器错误。
我个人也遇到了同样的问题,并且在任何地方都找不到解决方法。我决定保持压缩并将静态文件的存储时间保留在默认的 4 小时。

1
事实证明,一个png文件导致了问题。我不知道为什么有时候png文件会以大写字母保存,比如PNG。显然这会导致whitenoise出现问题。我花了很长时间才弄清楚,希望能帮到你。

0

对我来说,static 模板标签出现了问题,但是 white-nose 没有提供任何有用的关于问题/错误的信息。

静态文件的地址出现了错误:

<link rel="icon" href="{% static 'images/favicon.png' %}">

原本应该是

<link rel="icon" href="{% static 'blog/images/favicon.png' %}">

在修正地址之后,我的问题得到了解决。


0

我尝试获取索引文件时遇到了类似的错误。

这个错误发生是因为我的 URL 配置方式如下:

path('admin/', admin.site.urls)

正在尝试获取 http://127.0.0.1:8000/admin,但是不带 /。

你可以从路径中删除 / 或者获取 http://127.0.0.1:8000/admin/


0

我之前在使用Whitenoise时也遇到过这个问题,很难找到原因。假设当DEBUG = True时没有错误,请尝试设置

WHITENOISE_AUTOREFRESH = True

在你的settings.py文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接