簡體   English   中英

Django 返回 500 Internal Server Error 而不是 index.html 當 Debug = False

[英]Django returning 500 Internal Server Error instead of index.html when Debug = False

我的 django web 應用程序出現問題,其中 django 在嘗試獲取 index.django 時返回 500 錯誤。 這僅在 Debug = False 時發生,並且僅在此模板中發生。 所有其他模板正常呈現而沒有錯誤。

我已經嘗試過白噪聲設置,favicon.ico 錯誤,檢查了所有路由,一切似乎都很好,我真的找不到錯誤。 奇怪的是它只發生在 index.html 中。

如果有人可以提供幫助,我將不勝感激,在此先感謝。

設置.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

網址.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")),
    ),
]

視圖.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')

這意味着你有一個錯誤,因為DEBUG = FALSE它沒有顯示錯誤。 您可以在console中或通過啟用DEBUG查看錯誤

我以前在使用 Whitenoise 時遇到過這種情況,很難找到原因。 當然假設您在DEBUG = True時沒有錯誤,請嘗試設置

WHITENOISE_AUTOREFRESH = True

在您的settings.py

事實證明,一個 png 文件導致了這個問題。 我不知道為什么 png 文件有時會以大寫字母保存,例如 PNG。 顯然,這導致了白噪聲問題。 我花了很長時間才弄清楚,希望它有幫助。

我的嘗試獲取索引文件時出現了類似的錯誤。

發生錯誤是因為我的網址是這樣配置的:

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

並試圖在沒有 / 的情況下獲取http://127.0.0.1:8000/admin

您可以從路徑中刪除 / 或獲取http://127.0.0.1:8000/admin/

對我來說, static模板標簽存在問題,但白鼻子確實為我提供了有關問題/錯誤的任何有用信息。

static 文件的地址有錯誤:

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

應該是

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

更正地址后,它解決了我的問題。

解決方案

我最近遇到了這個問題,我不得不刪除

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

並將其替換為

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

我希望這有幫助。

祝你今天過得愉快

您可以將STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'更改為STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'

您將在提供文件時保持壓縮,但您將丟失 static 文件文件名的散列。

這種文件名的“散列”甚至意味着什么?

whitenoise.storage.CompressedManifestStaticFilesStorage所做的是在collectstatic方法期間將 static 文件作為具有唯一散列名稱的附加文件保存到您的STATIC_ROOT目錄中。

當您使用 whitenoise 為您的 static 文件提供服務時,它會在瀏覽器中以 4 小時的默認 Cache-Control 緩存文件。 這意味着您頁面的訪問者,當他們第一次訪問您的網站時,會獲得 static 文件,如果他們在這 4 小時內再次訪問 window,他們將使用 ZA81259CEF8E959C3624DF1D456E 文件的緩存版本。 這導致更快的頁面加載時間。

您可以將此緩存控制設置為更長的時間(例如 1 年),但這意味着您對 static 文件所做的任何更新,如果用戶仍然在瀏覽器中獲得 static 文件的緩存版本,則用戶將無法看到.

Django 通過ManifestStaticFilesStorage提供了一種解決方法。 它使用 hash 生成的文件名保存文件,該文件名僅在文件更新時才會更改。 Whitenoise 將這些文件視為新文件,並在它們發生更改時在瀏覽器緩存中更新它們。 你基本上得到了兩個世界的最好的:更長的緩存控制和用戶瀏覽器如果他們被改變了新的文件。

出於某種原因,django 沒有讀取您的散列文件名。 這與白噪聲無關,是 django "django.contrib.staticfiles.storage.ManifestStaticFilesStorage"問題。 首先嘗試讓它在沒有白噪聲的情況下工作,並弄清楚為什么"django.contrib.staticfiles.storage.ManifestStaticFilesStorage"會引發 500 服務器錯誤。

我個人有同樣的問題,無法在任何地方找到解決方案。 我決定保持壓縮並將 static 文件的保質期保留為默認 4 小時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM