การตั้งค่า DEBUG = เท็จทำให้เกิดข้อผิดพลาด 500


298

เมื่อฉันเปลี่ยนDEBUG = False, เว็บไซต์ของฉันจะสร้าง 500 (ใช้ WSGI & runserver manage.py) และไม่มีข้อมูลผิดพลาดในการบันทึกข้อผิดพลาด Apache และมันจะทำงานได้ตามปกติเมื่อฉันเปลี่ยนไปdebugTrue

ฉันใช้ Django 1.5 & Python 2.7.3 นี่คือบันทึกการเข้าถึง Apache และไม่มีบันทึกข้อผิดพลาด apache

www.beta800.net:80 222.247.56.11 - - [28/Feb/2013:13:42:28 +0800] "GET / HTTP/1.1" 500 257 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22"
www.beta800.net:80 222.247.56.11 - - [28/Feb/2013:13:42:28 +0800] "GET /favicon.ico HTTP/1.1" 500 257 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22"
www.beta800.net:80 222.247.56.11 - - [28/Feb/2013:13:42:28 +0800] "GET /favicon.ico HTTP/1.1" 500 257 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22"

นี่คือไฟล์การตั้งค่าของฉัน:

import os.path    
DEBUG = False 
#TEMPLATE_DEBUG = DEBUG

HERE = os.path.dirname(__file__)
ADMINS = (
    ('admin', 'xyzadmin@qq.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'zdm',                      # Or path to database file if using sqlite3.
        'USER': 'root',                      # Not used with sqlite3.
        'PASSWORD': 'passwd',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'America/Chicago'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True

# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = ''

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = ''

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
#STATIC_ROOT = os.path.join(HERE, 'static').replace('\\','/')

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'
#STATIC_ROOT = os.path.join(HERE, 'static').replace('\\','/')
S= os.path.join(HERE, 'static').replace('\\','/')

# Additional locations of static files
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    '/home/zdm/static',
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

# Make this unique, and don't share it with anybody.
SECRET_KEY = '9a7!^gp8ojyk-^^d@*whuw!0rml+r+uaie4ur$(do9zz_6!hy0'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'zdm.urls'

# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'zdm.wsgi.application'

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    '/home/zdm/templates',
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'zdm',
    'portal',
    'admin',
    'tagging',
)

ใช่ฉันมีไฟล์ 403 & 404 500 html ในเทมเพลตของฉัน dir
zhiguo.wang

คุณมีไฟล์ 500.html และ 404.html และ 403.html ไหม ฉันคิดว่าฉันจำได้ว่ามีปัญหากับโครงการที่ปรับใช้ซึ่งไม่มีไฟล์เหล่านั้นในรูทของไดเรกทอรีแม่แบบของฉัน
esse

หากไซต์ของคุณสร้างข้อผิดพลาด 500 ควรมีข้อมูลบางอย่างในบันทึก apache คุณอาจต้องการวางไฟล์บันทึกข้อผิดพลาดที่ส่วนท้ายของไฟล์บันทึกข้อผิดพลาดเพื่อให้คนดู
esse

87
คุณอาจต้องการเปลี่ยน SECRET_KEY ของคุณในขณะนี้เพื่อให้บริการแบบสาธารณะ ...
Fraxtil

1
นี่ไม่ใช่คำตอบสำหรับทุกคน ดังที่แสดงไว้ด้านล่างในstackoverflow.com/a/37218484/4028977อาจมีหลายสาเหตุว่าทำไมสิ่งนี้จึงเกิดขึ้น ด้วยการบันทึกง่ายๆคุณสามารถค้นหาได้โดยไม่ต้องคาดเดา
Rob

คำตอบ:


413

Django 1.5 แนะนำการตั้งค่าโฮสต์ที่อนุญาตซึ่งจำเป็นสำหรับเหตุผลด้านความปลอดภัย ไฟล์การตั้งค่าที่สร้างด้วย Django 1.5 มีส่วนใหม่ที่คุณต้องเพิ่ม:

# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.9/ref/settings/#allowed-hosts
ALLOWED_HOSTS = []

เพิ่มโฮสต์ของคุณที่นี่เหมือน['www.beta800.net']หรือ['*']สำหรับการทดสอบอย่างรวดเร็วแต่ไม่ได้ใช้['*']สำหรับการผลิต


32
ว้าว - นี่เรายาก มันแย่จริง ๆ ที่การตั้งค่านี้ถูกฝังอยู่ในเอกสาร ไซต์การผลิตของเราจะไม่ทำงานกับ DEBUG = False ขอบคุณสำหรับการชี้สิ่งนี้ !!!
shreddd

4
เพิ่มเติมเกี่ยวกับปัญหาด้านความปลอดภัยที่นำการตั้งค่านี้: การปฏิบัติ HTTP โจมตีส่วนหัวของโฮสต์ จะทำให้คุณมั่นใจอย่างแน่นอนว่าจะไม่ใช้['*']ในการผลิต
gertvdijk

4
BL น่ารำคาญที่พวกเขาไม่ได้ติดไว้ในฐานะที่เป็นค่าเริ่มต้นใน settings.py อาจจะมีความคิดเห็น expanatory ...
hwjp

7
บางครั้งฉันสงสัยว่าทำไม Django ถึงปัญญาอ่อนมากขึ้นเรื่อย ๆ ! แน่นอนว่าคนเหล่านั้นเป็นโปรแกรมเมอร์ที่ดีกว่าฉันมาก แต่ฉันไม่เข้าใจการตัดสินใจที่จะ "แก้ไข" ช่องโหว่ในระดับแอปพลิเคชันเมื่อการย้ายที่แท้จริงและสะอาดคือการกำหนดค่าเซิร์ฟเวอร์อย่างถูกต้อง กันไปสำหรับ "แม่แบบแคช" และ "การเชื่อมต่อถาวร" ... รหัสที่ไม่มีประโยชน์ที่จะไม่ถูกใช้ในเว็บไซต์ที่ร้ายแรง; ยังคงถูกนำเสนอเป็นจอกศักดิ์สิทธิ์ของการเขียนโปรแกรม! อาจจะเป็นเพียงฉันฉันเคยผิดมาก่อน!
StefanNch

3
ไม่เป็นไรพบปัญหา มันมีความสัมพันธ์กับdjango-pipelineพฤติกรรมของเมื่อยังไม่ได้รวบรวมแบบคงที่ ในฐานะที่เป็นเคล็ดลับทั่วไปการวางเบรกพอยต์ในhandle_uncaught_exceptionวิธีของ Django จะช่วยให้คุณทราบว่าเกิดอะไรขึ้นที่นี่
ปีเตอร์

51

ฉันรู้ว่ามันมาช้า แต่ฉันลงเอยด้วยการค้นหาข้อผิดพลาด 500 ด้วยDEBUG=Falseในกรณีของฉันมันกลายเป็นALLOWED_HOSTSแต่ฉันใช้os.environ.get('variable')เพื่อเติมข้อมูลโฮสต์ฉันไม่ได้สังเกตสิ่งนี้จนกว่าฉันจะเปิดใช้งานการบันทึกคุณสามารถ บันทึกข้อผิดพลาดทั้งหมดไปยังไฟล์ด้านล่างและมันจะเข้าสู่ระบบแม้ว่าDEBUG=False:

# settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt' : "%d/%b/%Y %H:%M:%S"
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': 'mysite.log',
            'formatter': 'verbose'
        },
    },
    'loggers': {
        'django': {
            'handlers':['file'],
            'propagate': True,
            'level':'DEBUG',
        },
        'MYAPP': {
            'handlers': ['file'],
            'level': 'DEBUG',
        },
    }
}

16
นี่ควรเป็นคำตอบที่ยอมรับได้ มีประโยชน์มากขึ้นเพียงแค่ถามกรอบตัวเองว่ามีอะไรผิดปกติหลังจากใช้การตั้งค่าการผลิตแทนที่จะพยายามเดา
Stefan Dragnev

4
อันที่จริงนี่ไม่ใช่สิ่งที่จะเดินไปมาในความมืดเกี่ยวกับ เพียงดูข้อความแสดงข้อผิดพลาดที่ปกติคุณจะเห็นการใช้วิธีนี้ ในกรณีของฉันฉันไม่มีการตั้งค่าที่แตกต่างกันใน settings.py ที่แอพของฉันกำลังค้นหา สิ่งที่ฉันต้องการก็แค่บันทึกเพื่อติดตามสิ่งนี้ สิ่งสำคัญที่ควรทราบ: ฉันเพิ่ม / path / to / my / django / ก่อน 'mysite.log' ดังที่แสดงในตัวอย่างเอกสาร: docs.djangoproject.com/en/1.10/topics/logging/#examples
Rob

4
ฉันใช้เวลาหลายชั่วโมงเพื่อหาทางแก้ไขไม่มีประโยชน์ ตามคำตอบนี้ใช้การบันทึกและคุณควรมีปัญหานี่คือคำตอบที่ดีที่สุด ขอบคุณ OP!
สแต็ค

ข้อผิดพลาดเซิร์ฟเวอร์ของฉันดูเหมือนจะไม่สร้างบันทึกใด ๆ ! ฉันได้ลองตั้งค่าการบันทึกต่าง ๆ แล้วไม่มีประโยชน์ ความคิดใด ๆ
cammil

5
ขอบคุณ! สิ่งนี้แก้ไขข้อผิดพลาดของฉัน กลับกลายเป็นว่าฉันจำเป็นต้องเรียกใช้การสะสมเพื่อรวบรวมสินทรัพย์คงที่จากแพคเกจ
themessup

33

ฉันพบปัญหาเดียวกันเมื่อเร็ว ๆ นี้ใน Django 2.0 DEBUG_PROPAGATE_EXCEPTIONS = Trueผมสามารถที่จะคิดออกปัญหาโดยการตั้งค่า ดูที่นี่: https://docs.djangoproject.com/en/2.0/ref/settings/#debug-propagate-exceptions

ValueError: Missing staticfiles manifest entry for 'admin/css/base.css'ในกรณีของข้อผิดพลาดได้ ฉันแก้ไขโดยการเรียกใช้ในpython manage.py collectstaticเครื่อง


ฉันไปในสิ่งเดียวกัน แต่สะสมไม่ได้แก้ไขให้ฉัน คุณได้รับข้อผิดพลาด "ไม่สามารถเข้าถึงได้" หรือไม่ ในกรณีนั้นคุณแก้ไขได้อย่างไร
Kavi Vaidya

23

ในกรณีของฉันการอ่านเอกสารของแอพของบุคคลที่สามช่วยฉันอย่างเหมาะสม

ผู้ร้าย? django_compressor

ฉันมี

{% load compress %}
{% compress css %}
 ... css files linked here ..
{% endcompress %}

DEBUG = True ให้เสมอกับฉัน 500. ในการแก้ไขฉันต้องมีบรรทัดในการตั้งค่าของฉันเพื่อให้มันทำงานได้

COMPRESS_ENABLED = os.environ.get('COMPRESS_ENABLED', False)

ขอบคุณนั่นคือเหตุผลที่มันไม่ทำงานสำหรับฉัน แต่บรรทัดนั้นไม่ปิดการใช้งาน django_compressor จากการทำงานหรือไม่
Fanckush

1
@Fanckush Nope ไม่มีส่วนเกี่ยวข้องกับอันตราย django-compressor.readthedocs.io/th/latest/settings/…คอมเพรสเซอร์ยังคงทำงานได้อย่างสมบูรณ์แบบ! เพียงแค่บีบอัดสถิตของคุณทั้งหมด (เช่น css) ดังนั้นการตั้งค่าจึงไร้ประโยชน์เนื่องจากสินทรัพย์ของคุณถูกบีบอัดอยู่แล้ว
KhoPhi

13

ขวาใน Django 1.5 ถ้า DEBUG = False กำหนดค่า ALLOWED_HOSTS เพิ่มโดเมนโดยไม่มีหมายเลขพอร์ต ตัวอย่าง:

ALLOWED_HOSTS = ['localhost']

ไม่ว่าจะด้วยเหตุผลใดก็ตามการใช้ 'localhost' ไม่ได้ผล ฉันต้องใช้ IP '127.0.0.1' แทน ฉันยังสามารถใช้ '*' ได้หากคุณรู้สึกกลัวและต้องการให้มันใช้งานได้ อย่างไรก็ตามฉันไม่แนะนำให้ทำเช่นนั้นในการผลิต OSX ใช้งาน Django 1.4.20
BlakePetersen

11

คุณต้องตรวจสอบ URL ของคุณทุกที่ เมื่อDEBUGตั้งค่าเป็นFalseURL ทั้งหมดที่ไม่มีการติดตาม/จะถือเป็นข้อผิดพลาดซึ่งแตกต่างจากเมื่อคุณมีDEBUG = Trueซึ่งในกรณีนี้ Django จะต่อท้าย/ทุกที่ที่ขาดหายไป ดังนั้นในระยะสั้นตรวจสอบให้แน่ใจว่าลิงก์ทั้งหมดลงท้ายด้วยเครื่องหมายสแลชทุกที่


3
เพียงแค่ใช้แท็ก reverse และ url แล้วคุณน่าจะดี
maazza

การตั้งค่าDEBUG=Falseสามารถเปิดเผยข้อผิดพลาดในการนำเข้าได้เช่น: stackoverflow.com/questions/25676453/…
ecoe

แม้แต่ลิงก์ไปยังเนื้อหา js และ css
amchugh89

@ amchugh89: ไม่เพียง URL "django"
webzy

1
ปัญหาของฉันคือ whitenoise ไม่สามารถค้นหาภาพบางภาพและกำลังโยน ValueError ฉันหามันไม่เจอ แต่ไม่รู้วิธีบอก whitenoise ว่าไม่ต้องหามัน ดังนั้นฉันจึงปิด whitenoise ใช้ django static เสิร์ฟและตอนนี้ฉันสามารถเรียกใช้ debug = False ใน prod เห็นได้ชัดว่าไม่เหมาะ :(
amchugh89

7

ฉันมีเรื่องตลกสำหรับทุกคน หลังจากมาถึงหน้านี้ฉันพูดว่า "ยูเรก้า! ฉันรอดแล้วนั่นต้องเป็นปัญหาของฉัน" ดังนั้นฉันจึงใส่ALLOWED_HOSTSรายการที่จำเป็นในการตั้งค่าและไม่มีอะไร ... ข้อผิดพลาด 500 เก่าเหมือนกัน และไม่ใช่เพราะไม่มีไฟล์ 404.html

ดังนั้น 2 วันฉันยุ่งกับทฤษฎีที่เป็นธรรมชาติเช่นมันมีบางอย่างเกี่ยวกับการให้บริการไฟล์แบบคงที่ (เข้าใจว่าฉันเป็นโนบและโนบไม่ทราบว่าพวกเขากำลังทำอะไร)

แล้วมันคืออะไร ตอนนี้คุณโมเดอเรเตอร์นั้นเรามาถึงเคล็ดลับที่มีประโยชน์แล้ว ในขณะที่การพัฒนาของฉันคือ Django เวอร์ชัน 1.5.something เวอร์ชันเซิร์ฟเวอร์การผลิตของฉันคือ 1.5.something + 1 ... หรืออาจจะบวก 2 ดังนั้นหลังจากที่ฉันเพิ่มALLOWED_HOSTSไปที่settings.pyรุ่นเดสก์ท็อปซึ่งขาดสิ่งที่ hwjp ร้องขอ --- "ค่าเริ่มต้นใน settings.py บางทีอาจมีความคิดเห็นอธิบาย" --- ฉันทำแบบเดียวกันกับเซิร์ฟเวอร์ที่ใช้งานจริงด้วย โดเมนที่เหมาะสมสำหรับมัน

แต่ฉันล้มเหลวที่จะสังเกตเห็นว่าบนเซิร์ฟเวอร์การผลิตที่มี Django รุ่นที่ใหม่กว่านั้นมีค่าเริ่มต้นใน settings.py พร้อมกับความคิดเห็นที่อธิบาย มันต่ำกว่าที่ฉันทำรายการของฉันออกไปให้พ้นสายตาบนจอมอนิเตอร์ และแน่นอนว่ารายการนั้นว่างเปล่า ดังนั้นฉันเสียเวลา


1
ฉันมีรูปแบบเฮฮาเหมือนกันทุกประการยกเว้นว่ามันจะกลายเป็นเฮฮาหลังจากที่ฉันพบสิ่งนี้แล้วเท่านั้นขอบคุณ ก่อนหน้านี้มันช่างน่าหงุดหงิดธรรมดา
binithb

บางสิ่งบางอย่างที่จะช่วยในทั้งหมดนี้คือการใช้สำหรับแต่ละสภาพแวดล้อมแล้วนำเข้าในlocal_settings.py settings.py
nicorellius

1
สิ่งที่ฉันชอบทำคือมีการตั้งค่า / ไดเรกทอรีแทน settings.py ในไดเรกทอรีนี้คุณสามารถมีไฟล์. py แยกต่างหากสำหรับสภาพแวดล้อมที่แตกต่างกันและ base.py สำหรับการตั้งค่าทั่วไป จากนั้นการตั้งค่าที่ขึ้นอยู่กับการผลิตสามารถเริ่มต้นได้โดยการนำเข้า * จากการตั้งค่าพื้นฐานและแทนที่สิ่งที่พวกเขาต้องการแทนที่ นอกจากนี้init .py ที่ต้องการยังจำเป็นต้องเปลี่ยนการตั้งค่า / ไดเรกทอรีนั้นเป็นโมดูลที่ถูกต้องก่อนสามารถนำเข้าจาก base.py แล้วลองนำเข้าจาก local.py (ซึ่งจะมีอยู่ในเครื่องเท่านั้น) นั่นหมายความว่าคุณไม่จำเป็นต้องระบุการตั้งค่าในเครื่องด้วยตนเอง
mephisto

7

การเสริมคำตอบหลัก
เป็นเรื่องน่ารำคาญที่จะเปลี่ยนค่าคงที่ ALLOWED_HOSTS และ DEBUG ค่าคงที่ส่วนกลางsettings.pyเมื่อสลับไปมาระหว่างการพัฒนาและการผลิต ฉันใช้รหัสนี้เพื่อตั้งค่าเหล่านี้โดยอัตโนมัติ:

import socket

if socket.gethostname() == "server_name":
    DEBUG = False
    ALLOWED_HOSTS = [".your_domain_name.com",]
    ...
else:
    DEBUG = True
    ALLOWED_HOSTS = ["localhost", "127.0.0.1",]
    ...

หากคุณใช้ macOS คุณสามารถเขียนรหัสทั่วไปได้มากกว่านี้:

if socket.gethostname().endswith(".local"): # True in your local computer
    DEBUG = True
    ALLOWED_HOSTS = ["localhost", "127.0.0.1",]
else:
    ...

6

สำหรับสิ่งที่คุ้มค่า - ฉันได้รับ 500 กับDEBUG = Falseบางหน้าเท่านั้น ติดตามข้อยกเว้นด้วย pdb พบเนื้อหาที่ขาดหายไป (ฉันสงสัยว่า{% static ... %}แท็กแม่แบบคือผู้ร้ายสำหรับ 500 คน


1
นี่เป็นปัญหาของฉันด้วยเช่นกันเทมเพลตพื้นฐานที่หน้า 404 ที่กำหนดเองนั้นใช้แท็กคงที่ แต่ไม่รวม {% load static%} ที่ด้านบน ฉันไม่ได้สังเกตที่อื่นเพราะเทมเพลตอื่นของฉันมีบรรทัดนี้ แต่ก็เหมาะสมที่จะวางไว้ที่ฐาน แต่อย่างใดเนื่องจากมันอ้างถึงไฟล์สแตติกทั่วทุกที่
krischan

2
วิธีแก้ปัญหาเดียวกันที่นี่ - ฉันใช้staticเพื่อรวมไฟล์ CSS ที่ไม่มีอยู่
Phil Gyford

5

DEBUG = FALSEผมประสบปัญหาเดียวกันเมื่อผมได้ทำ นี่คือโซลูชันที่รวมเป็นหนึ่งเดียวซึ่งกระจายอยู่ในคำตอบด้านบนและโพสต์อื่น ๆ

โดยค่าเริ่มต้นใน settings.py ALLOWED_HOSTS = []เรามี นี่คือการเปลี่ยนแปลงที่เป็นไปได้ที่คุณจะต้องสร้างALLOWED_HOSTSมูลค่าตามสถานการณ์เพื่อกำจัดข้อผิดพลาด:

1: ชื่อโดเมนของคุณ:

ALLOWED_HOSTS = ['www.example.com'] # Your domain name here

2: IP ของเซิร์ฟเวอร์ที่ใช้งานของคุณหากคุณยังไม่มีชื่อโดเมน (ซึ่งเป็นกรณีของฉันและทำงานได้อย่างมีเสน่ห์):

ALLOWED_HOSTS = ['123.123.198.123'] # Enter your IP here

3: ถ้าคุณกำลังทดสอบบนเซิร์ฟเวอร์ภายในคุณสามารถแก้ไขของคุณsettings.pyหรือsettings_local.pyเป็น:

ALLOWED_HOSTS = ['localhost', '127.0.0.1']

4: คุณสามารถระบุ '*' ในALLOWED_HOSTSค่าได้ แต่ไม่แนะนำในสภาพแวดล้อมการผลิตเนื่องจากเหตุผลด้านความปลอดภัย:

ALLOWED_HOSTS = ['*'] # Not recommended in production environment

ฉันได้โพสต์โซลูชันโดยละเอียดลงในบล็อกของฉันซึ่งคุณอาจต้องการอ้างอิง


5

ALLOWED_HOSTS ไม่ใช่ปัญหาเดียวสำหรับฉันฉันต้องสร้าง 404.html และวางไว้ในระดับพื้นฐานของแม่แบบของฉัน (ไม่ใช่ระดับแอป) - นอกจากนี้คุณสามารถสร้างมุมมอง 404 และเพิ่ม URL 404 ตัวจัดการ แต่ฉันคิดว่านั่นเป็น ไม่จำเป็น. 404.html แก้ไข

ใน mainproject.urls

handler404 = 'app.views.custom_404'

ในแอพ

def custom_404(request):
    return render(request, '404.html', {}, status=404)

จากนั้นสร้างเทมเพลต / 404.html เทมเพลต

ได้รับจากโพสต์ S / O อื่นที่ฉันหาไม่พบ

แก้ไข

นอกจากนี้ฉันยังได้รับข้อผิดพลาด 500 เมื่อฉันแสดงเนื้อหาด้วย whitenoise ไม่สามารถคิดออกว่าสำหรับชีวิตของฉันข้อผิดพลาดคือ ValueError จาก whitenoise ที่ไม่สามารถค้นหาเนื้อหาที่ฉันไม่สามารถหาได้ต้องไปกับ django ที่เป็นค่าเริ่มต้นในตอนนี้


8
ฉันมีปัญหาเดียวกันกับ whitenoise python manage.py collectstaticซ่อมมัน.
Eugene Pakhomov

1
@ amchungh89 คุณเป็นผู้ช่วยชีวิต! ขอบคุณสำหรับการชี้ให้เห็นว่า
Deepak Sharma

5

ฉันกำลังค้นหาและทดสอบเพิ่มเติมเกี่ยวกับปัญหานี้และฉันรู้ว่าไดเรกทอรีสแตติกไฟล์ที่ระบุใน settings.py อาจเป็นสาเหตุของเรื่องนี้ได้ดังนั้นเราต้องเรียกใช้คำสั่งนี้ก่อน

python manage.py collectstatic

ใน settings.py โค้ดควรมีลักษณะดังนี้:

STATIC_URL = '/static/'

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

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

3

ฉันรู้ว่านี่เป็นคำถามที่เก่ามาก แต่บางทีฉันอาจช่วยคนอื่นได้ หากคุณมีข้อผิดพลาด 500 หลังจากตั้งค่า DEBUG = False คุณสามารถเรียกใช้ Manage.py runserver ในบรรทัดคำสั่งเพื่อดูข้อผิดพลาดที่จะไม่ปรากฏในบันทึกข้อผิดพลาดทางเว็บใด ๆ


2

กลางปี ​​2019 และฉันประสบข้อผิดพลาดนี้หลังจากสองสามปีของการพัฒนากับ Django ทำให้ฉันงุนงงตลอดทั้งคืน! มันไม่ได้รับอนุญาตให้โฮสต์ (ซึ่งควรจะโยน 400) ทุกอย่างอื่นตรวจสอบในที่สุดก็ทำข้อผิดพลาดบางอย่างเท่านั้นที่ค้นพบว่าบางคนที่ขาดหายไป / หรือ messed up ไฟล์คงที่รายการ (หลังจากที่รวบรวม) กำลังขันกับการติดตั้ง เรื่องสั้นสั้น ๆ สำหรับผู้ที่ถูกนิ่งงันและเกิดขึ้นอีกครั้งโดยใช้ WHITENOISE หรือ DJANGO STATICFILE BACKEND ด้วย CACHE (ไฟล์คงที่ชัดแจ้ง) บางทีนี่อาจเหมาะสำหรับคุณ

  1. ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าทุกอย่าง (เช่นเดียวกับที่ฉันทำกับแบ็กเอนด์ whitenoise ... django แบ็กเอนด์อ่านต่ออย่างไรก็ตาม) http://whitenoise.evans.io/en/stable/django.html

  2. หากรหัสข้อผิดพลาด 500 ยังคงยิงคุณอยู่ให้จดบันทึกการตั้งค่าของคุณ STATICFILES_STORAGE

ตั้งค่าเป็นทั้ง (สำหรับแบ็กเอนด์ whitenoise ด้วยการบีบอัด)

STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'

หรือ (ปล่อยให้เป็นค่าเริ่มต้น django)

STATICFILES_STORAGE = django.contrib.staticfiles.storage.StaticFilesStorage

สรุปปัญหาดูเหมือนจะมาจากข้อเท็จจริงที่ว่าแคช whitenoise + แบ็กเอนด์การบีบอัด ->

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

หรือแบ็กเอนด์แคชของ django ->

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

... ไม่ค่อยได้ผลสำหรับฉันเนื่องจาก CSS ของฉันอ้างอิงแหล่งข้อมูลอื่น ๆ ซึ่งอาจสับสนในระหว่างการแคชสะสม / แบ็กเอนด์ ปัญหานี้อาจมีการเน้นในhttp://whitenoise.evans.io/en/stable/django.html#storage-troubleshoot


1

ฉันคิดว่าอาจเป็นการตั้งค่าเซิร์ฟเวอร์ http ของฉันยังขาดและมี ALLOWED_HOSTS ตลอดเวลา ฉันสามารถเข้าถึงได้ในเครื่อง (ฉันใช้ gunicorn) แต่ไม่สามารถใช้ชื่อโดเมนได้เมื่อ DEBUG = False เมื่อฉันลองใช้ชื่อโดเมนมันทำให้ฉันมีข้อผิดพลาดดังนั้นทำให้ฉันคิดว่ามันเป็นปัญหาที่เกี่ยวข้องกับ nginx

นี่คือไฟล์ conf ของฉันสำหรับ nginx:

server {
    listen   80;
    server_name localhost myproject.ca www.myproject.ca;
    root /var/web/myproject/deli_cms;

    # serve directly - analogous for static/staticfiles
    location /media/ {
        # if asset versioning is used
        if ($query_string) {
            expires max;
        }
    }
    location /admin/media/ {
        # this changes depending on your python version
        root /var/web/myproject/lib/python2.6/site-packages/django/contrib;
    }
    location /static/ {
    alias /var/web/myproject/deli_cms/static_root/;
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;
        proxy_pass http://localhost:8000/;
    }
    # what to serve if upstream is not available or crashes
    error_page 500 502 503 504 /media/50x.html;
}

ไฟล์ config ของ gunicorn ของฉันมีดังนี้: #! / bin / bash cd / var / web / delicms_env / deli_cms / source ../bin/activate exec gunicorn --workers = 3 deli_cms.wsgi: แอปพลิเคชัน
user2868304

ปัญหาของฉันได้รับการแก้ไขแล้วตอนนี้ฉันใช้สคริปต์ gunicorn_django และมันทำให้ฉันเลิกใช้ข้อความแล้ว ยังไม่แน่ใจว่าทำไมมันทำงานในพื้นที่ไม่เปลี่ยน nginx config ของฉันเพิ่งเปลี่ยนสคริปต์เก่าเพื่อใช้ gunicorn และใช้ wsgi: application module แทนและทำงานได้อีกครั้ง Gunicorn กำลังขว้างข้อความแสดงความไม่พอใจออกมาก่อนหน้านี้เช่นกัน แต่ก็ไม่มีอะไรเฉพาะเจาะจงสำหรับปัญหาของฉัน
user2868304

1

ฉันมีปัญหาที่คล้ายกันในกรณีของฉันมันเกิดจากการมีสคริปต์ความคิดเห็นภายในแท็กร่างกาย

<!--<script>  </script>-->

1

ฉันพบปัญหานี้ ปรากฎว่าฉันรวมอยู่ในเทมเพลตโดยใช้staticแท็กเทมเพลตซึ่งเป็นไฟล์ที่ไม่มีอยู่อีก ดูในบันทึกแสดงให้ฉันเห็นปัญหา

ฉันเดาว่านี่เป็นเพียงหนึ่งในสาเหตุที่เป็นไปได้สำหรับข้อผิดพลาดประเภทนี้

คุณธรรมของเรื่องราว: บันทึกข้อผิดพลาดและตรวจสอบบันทึกเสมอ


1

ขอบคุณ @squarebear ในไฟล์บันทึกฉันพบข้อผิดพลาด: ValueError: The file 'myapp/styles.css' could not be found with <whitenoise.storage.CompressedManifestStaticFilesStorage ...>ในแฟ้มบันทึกผมพบข้อผิดพลาด:

ฉันมีปัญหาเล็กน้อยในแอพ django ของฉัน ฉันลบบรรทัด
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'ที่พบจากเอกสารของ heroku

ฉันยังต้องเพิ่มไดเรกทอรีพิเศษ (ขอบคุณคำตอบ SO อื่น ) staticในรากของแอปพลิเคชัน django ราวกับmyapp/staticว่าฉันไม่ได้ใช้มัน จากนั้นเรียกใช้คำสั่งpython manage.py collectstaticก่อนเรียกใช้เซิร์ฟเวอร์เพื่อแก้ไขปัญหา ในที่สุดมันก็เริ่มทำงานได้ดี


คำถามนี้จะตอบคำถามเดิมอย่างไร
Nick

1

ฉันเริ่มได้ 500 สำหรับ debug = False ในรูปแบบของ

django.urls.exceptions.NoReverseMatch: Reverse for 'home' not found.
or...
django.urls.exceptions.NoReverseMatch: Reverse for 'about' not found.

เมื่อเพิ่มdjango.core.exceptions.ValidationErrorแทนที่จะเพิ่มrest_framework.serializers.ValidationError

เพื่อความเป็นธรรมมันได้เพิ่ม 500 ก่อนหน้านี้ แต่เป็น ValidationError โดยมี debug = False สิ่งนี้เปลี่ยนเป็น NoReverseMatch



0

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันยังได้รับข้อผิดพลาด 500 เมื่อ DEBUG = False หลังจากผ่านไปหลายชั่วโมงฉันก็รู้ว่าฉันลืมที่จะจบลิงค์ใน base.html ด้วยเครื่องหมายทับ


แม้แต่สิ่งที่ CSS และ js?
amchugh89

0

นี่เก่าและปัญหาของฉันก็จบลงด้วยการเกี่ยวข้องกับปัญหา แต่ไม่ใช่สำหรับ OP แต่วิธีแก้ปัญหาของฉันคือสำหรับคนอื่น ๆ ที่ลองใช้วิธีดังกล่าวแล้วไม่มีประโยชน์

ฉันมีการตั้งค่าใน Django เวอร์ชันที่แก้ไขเพื่อลดขนาดไฟล์ CSS และ JS ที่ทำงานเฉพาะเมื่อ DEBUG หยุดทำงาน เซิร์ฟเวอร์ของฉันไม่ได้ติดตั้ง CSS minifier และเกิดข้อผิดพลาด หากคุณใช้ Django-Mako-Plus นี่อาจเป็นปัญหาของคุณ


0

สิ่งเล็ก ๆ น้อย ๆ ที่ควรสังเกตถ้าอาเรย์นั้นไม่มีในนั้นโฮสต์ที่ได้รับอนุญาตทั้งหมดจะถูกละเว้น

ALLOWED_HOSTS = [
    "localhost",
    None,
    'example.com', # First DNS alias (set up in the app)
    #'www.example.com', # Second DNS alias (set up in the app)
]

Django version 1.8.4


0

สายไปงานปาร์ตี้และนอกหลักสูตรอาจมีปัญหามากมาย แต่ฉันมีปัญหาที่คล้ายกันและปรากฎว่าฉันมี {%%} อักขระพิเศษในคำพูด HTML ของฉัน ...

<!-- <img src="{% static "my_app/myexample.jpg" %}" alt="My image"/> -->

0

ฉันมีมุมมองหนึ่งที่โยนข้อผิดพลาด 500 ข้อใน debug = false แต่ทำงานใน debug = true สำหรับทุกคนที่ได้รับสิ่งนี้และโฮสต์ที่ได้รับอนุญาตไม่ใช่ปัญหาฉันได้แก้ไขมุมมองของฉันโดยอัปเดตแท็กคงที่ของเทมเพลตที่ชี้ไปยังตำแหน่งที่ไม่ถูกต้อง

ดังนั้นฉันขอแนะนำให้เพียงแค่ตรวจสอบลิงก์และแท็กว่ามีสุญญากาศในเทมเพลตใด ๆ ที่ใช้บางทีบางสิ่งอาจผ่านเน็ตในการดีบัก แต่ให้ข้อผิดพลาดในการผลิต


0

ฉันพบอีกสาเหตุของข้อผิดพลาด 500 เมื่อ DEBUG = False ผมใช้ Django compressorยูทิลิตี้และการอ้างอิงวิศวกร front-end ของเราเพื่อเพิ่มไฟล์ font ภายในcompress cssกระชากแม่แบบ Django แบบนี้:

{% compress css %}
    <link href="{% static "css/bootstrap.css" %}" rel="stylesheet">
    <link href="{% static "css/bootstrap-spinedit.css" %}" rel="stylesheet">
    <link href="{% static "djangular/css/styles.css" %}" rel="stylesheet">
    <link href="{% static "fonts/fontawesome-webfont.ttf" %}" rel="stylesheet">
{% endcompress %}

ทางออกคือการย้ายลิงค์ไปยังttfไฟล์ด้านล่างendcompressบรรทัด


0

ฉันมีปัญหาคล้ายกับสิ่งนี้และฉันจะรายงานว่าฉันแก้ไขปัญหาของฉันได้อย่างไรเพราะอาจเป็นไปได้ว่าใครบางคนกำลังประสบปัญหาเช่นเดียวกัน

ในกรณีของฉันข้อผิดพลาดเกิดขึ้นเนื่องจากเซิร์ฟเวอร์ไม่พบไฟล์สแตติกจากหน้าแรก

ดังนั้นตรวจสอบให้แน่ใจว่ามีข้อผิดพลาดเกิดขึ้นใน indexหรือเกิดขึ้นในหน้าอื่น หากปัญหาเกิดขึ้นเฉพาะในดัชนีคุณอาจต้องตรวจสอบไฟล์คงที่ ฉันแนะนำให้เปิดคอนโซลตัวอย่างของ Chrome และตรวจสอบข้อผิดพลาดใด ๆ

ในกรณีของฉันเซิร์ฟเวอร์ไม่พบfavicon.icoและอีกสอง CSS

เพื่อแก้ไขปัญหานี้ฉันผ่านpython manage.py collectstaticและใช้งานได้


0

ฉันรู้ว่าโพสต์นี้ค่อนข้างเก่า แต่ก็ยังมีความเกี่ยวข้องอย่างสมบูรณ์แบบในวันนี้

สำหรับสิ่งที่คุ้มค่า - ฉันได้รับ 500 DEBUG = Falseสำหรับทุกหน้าในเว็บไซต์ของฉัน

ฉันไม่ได้รับการติดตามกลับเมื่ออยู่ในการแก้ปัญหา

ฉันต้องผ่านทุกลิงก์คงที่ในแม่แบบของฉันภายในเว็บไซต์ของฉันและพบหนึ่ง / (เครื่องหมายทับ) ด้านหน้าแหล่งที่มารูปภาพของฉัน {% คงที่ ... %}. สิ่งนี้ทำให้เกิดข้อผิดพลาด 500 ครั้งDEBUG = Falseแต่ทำงานได้อย่างสมบูรณ์แบบDebug = Trueโดยไม่มีข้อผิดพลาด น่ารำคาญมาก! ถูกเตือน! เสียเวลาหลายชั่วโมงเนื่องจากการสาดไปข้างหน้า ...


0

คุณอาจต้องการเรียกใช้python manage.py collectstaticหลังจากที่คุณตั้งค่าDEBUG = FalseและในALLOWED_HOSTS = ['127.0.0.1'] settings.pyหลังจากสองขั้นตอนเหล่านี้เว็บแอปพลิเคชันของฉันทำงานได้ดีในเซิร์ฟเวอร์ท้องถิ่นของฉันแม้จะมีโหมด DEBUG = False

BTW ฉันมีการตั้งค่าเหล่านี้มา settings.pyมา

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware', # what i added
    'django.middleware.common.CommonMiddleware', # and so on...
]

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

ฉันคิดว่าการตั้งค่า whitenoise อาจเกี่ยวข้องกับคำสั่งรวบรวบ


-3

ตกลงหลังจากลองหลาย ๆ อย่างแล้วทางออกที่ถูกต้องคือ ...

คุณต้องตั้งค่าDEBUG = 'FALSE'ไม่FalseหรือFALSEแต่'FALSE'ด้วย''


ฉันคิดว่า 'FALSE' เป็นสตริงดังนั้นมันจึงเท่ากับ True ดังนั้นจึงไม่ได้รับข้อผิดพลาด
apet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.