Ustawienie DEBUG = Fałsz powoduje 500 Błąd


298

Raz zmienić DEBUG = False, moja strona będzie generować 500 (przy użyciu WSGI & manage.py runserver), a nie ma informacji o błędzie w dzienniku błędów Apache i to będzie działać normalnie, kiedy zmieni debugsię True.

Używam Django 1.5 i Python 2.7.3 tutaj jest dziennik dostępu Apache i bez żadnego dziennika błędów dziennika 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"

Oto mój plik ustawień:

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',
)

Tak,
dodałem

Czy masz pliki 500.html oraz 404.html i 403.html? Myślę, że pamiętam problem z wdrożonym projektem, który nie miał tych plików w katalogu głównym katalogu szablonów.
esse

Jeśli Twoja witryna generuje błąd 500, w dzienniku apache powinny znajdować się pewne informacje. Możesz pominąć fragment pliku dziennika błędów, aby inni mogli na niego spojrzeć.
esse

87
Możesz zmienić SECRET_KEY teraz, gdy jest publicznie dostępny ...
Fraxtil

1
To nie jest odpowiedź dla wszystkich. Jak pokazano poniżej w stackoverflow.com/a/37218484/4028977 , może istnieć wiele przyczyn tego zjawiska. Za pomocą prostego logowania możesz dowiedzieć się bez zgadywania.
Rob

Odpowiedzi:


413

Django 1.5 wprowadziło ustawienie dozwolonych hostów, które jest wymagane ze względów bezpieczeństwa. Plik ustawień utworzony za pomocą Django 1.5 zawiera nową sekcję, którą należy dodać:

# 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 = []

Dodaj tutaj swojego hosta, tak jak ['www.beta800.net']lub ['*']do szybkiego testu, ale nie używaj go ['*']do produkcji .


32
Wow - to nas mocno ugryzło. Naprawdę szkoda, że ​​to ustawienie jest zakopane w dokumentach. Nasz zakład produkcyjny nie będzie działał z DEBUG = False. Dziękujemy za zwrócenie uwagi !!!
shreddd

4
Więcej informacji na temat problemów związanych z bezpieczeństwem, które wprowadziły to ustawienie: Praktyczne ataki na nagłówki hosta HTTP . Na pewno przekonają Cię, aby nie używać ['*']w produkcji.
gertvdijk

4
bl. denerwujące, że nawet nie wpisują go jako wartości domyślnej w settings.py, być może z komentarzem wyjaśniającym ...
hwjp

7
Czasami zastanawiam się, dlaczego Django staje się coraz bardziej opóźniony! Z pewnością ci faceci są znacznie lepszymi programistami ode mnie, ale tak naprawdę nie rozumiem decyzji o „naprawieniu” luk w zabezpieczeniach na poziomie aplikacji, kiedy prawdziwym i czystym posunięciem byłoby prawidłowe skonfigurowanie serwera. To samo dotyczy „buforowania szablonów” i „trwałych połączeń” ... Bezużyteczny kod, który nigdy nie zostanie użyty na poważnej stronie; wciąż jest przedstawiany jako święty graal programowania! Może to tylko ja, wcześniej się myliłem!
StefanNch

3
Nieważne, znalazłem problem. Było to związane z django-pipelinezachowaniem, gdy ładunek statyczny nie został jeszcze zebrany. Ogólna wskazówka: umieszczenie punktu przerwania w metodzie Django handle_uncaught_exceptionpomoże ci dowiedzieć się, co się tutaj dzieje.
Pieter

51

Wiem, że to jest późno, ale skończyło się na tym, że szukałem błędu 500 DEBUG=False, w moim przypadku okazało się, ALLOWED_HOSTSale użyłem os.environ.get('variable')do zapełnienia hostów, nie zauważyłem tego, dopóki nie włączyłem logowania, możesz zaloguj wszystkie błędy do pliku poniżej, a loguje się nawet, gdy 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
To powinna być zaakceptowana odpowiedź. O wiele bardziej przydatne jest po prostu zapytanie samego frameworka, co jest nie tak po użyciu ustawień produkcji, zamiast zgadywania.
Stefan Dragnev

4
Rzeczywiście, nie jest to coś, co można wędrować po ciemku. Wystarczy spojrzeć na komunikat o błędzie, który normalnie można zobaczyć przy użyciu tej metody. W moim przypadku brakowało innego ustawienia w pliku settings.py, którego szukała moja aplikacja. Potrzebowałem tylko dziennika, aby to wyśledzić. Jedna ważna uwaga: dodałem / path / do / my / django / przed „mysite.log”, jak pokazano w przykładzie docs: docs.djangoproject.com/en/1.10/topics/logging/#examples
Rob

4
Spędziłem godziny szukając rozwiązania, bezużyteczne. zgodnie z tą odpowiedzią wystarczy użyć rejestrowania i powinieneś mieć problem, to najlepsza odpowiedź. Dzięki, OP!
Stack

Moje błędy serwera wydają się nie generować żadnych dzienników! Próbowałem różnych konfiguracji logowania bezskutecznie. Jakieś pomysły?
cammil

5
Dziękuję Ci! To rozwiązało mój błąd. Okazuje się, że musiałem uruchomić kolektywne, aby zebrać jakieś statyczne zasoby z pakietu.
tematycznie

33

Ostatnio spotkałem ten sam problem w Django 2.0. Ustawiłem problem DEBUG_PROPAGATE_EXCEPTIONS = True. Zobacz tutaj: https://docs.djangoproject.com/en/2.0/ref/settings/#debug-propagate-exceptions

W moim przypadku błąd był ValueError: Missing staticfiles manifest entry for 'admin/css/base.css'. Naprawiłem to, uruchamiając lokalnie python manage.py collectstatic.


Idę tak samo, ale Collectstatic nie naprawił tego dla mnie. Czy wystąpił błąd „nie można osiągnąć błędu”? W takim razie, jak to naprawiłeś?
Kavi Vaidya

23

W moim przypadku czytanie dokumentów aplikacji innych firm właściwie mnie uratowało.

Sprawca? django_compressor

miałem

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

DEBUG = True zawsze dawał mi 500. Aby to naprawić, potrzebowałem linii w moich ustawieniach, aby ją uruchomić

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

Dzięki, że to dla mnie nie zadziałało, ale czy ta linia nie uniemożliwia django_compressor wykonywania swojej pracy?
Fanckush,

1
@Fanckush Nope. Nie wiąże się to ze szkodą. django-compressor.readthedocs.io/en/latest/settings/… Kompresor nadal doskonale działałby ! Po prostu skompresuj wszystkie statystyki (np. Css), aby ustawienie było bezużyteczne, ponieważ Twoje zasoby są już skompresowane
KhoPhi

13

Tak, w Django 1.5, jeśli DEBUG = False, skonfiguruj ALLOWED_HOSTS, dodając domeny bez numeru portu. przykład:

ALLOWED_HOSTS = ['localhost']

Z jakiegokolwiek powodu używanie „localhost” nie działało dla mnie. Zamiast tego musiałem użyć adresu IP „127.0.0.1”. Mogłem również użyć „*”, jeśli wariujesz i chcesz, żeby to zadziałało. Jednak nie radziłbym tego robić podczas produkcji. OSX z uruchomionym Django 1.4.20
BlakePetersen

11

Musisz także sprawdzić adresy URL w całym miejscu. Kiedy DEBUGjest ustawiony na False, wszystkie URL-e bez końca /są traktowane jako błąd, w przeciwieństwie do twojego DEBUG = True, w którym to przypadku Django dołącza się /wszędzie tam, gdzie go brakuje. Krótko mówiąc, upewnij się, że wszystkie linki kończą się ukośnikiem WSZĘDZIE.


3
wystarczy użyć odwrotnego i url tagu i powinieneś być w porządku
maazza

ustawienie DEBUG=Falsemoże również ujawnić błędy importu: stackoverflow.com/questions/25676453/…
ecoe

nawet linki do zasobów js i css?
amchugh89

@ amchugh89: nie, po prostu adresy URL „django”
webzy

1
Mój problem polega na tym, że whitenoise nie mógł znaleźć jakiegoś obrazu i rzucał ValueError. Ja też nie mogłem go znaleźć, ale nie wiedziałem, jak powiedzieć whitenoise, żeby tego nie szukał. Wyłączyłem więc whitenoise, użyłem statycznego serwowania django i teraz mogę uruchomić debug = False in prod. Oczywiście nie idealny :(
amchugh89

7

Mam zabawną historię dla wszystkich. Po wejściu na tę stronę powiedziałem „Eureka! Jestem uratowany. To MUSI być mój problem”. Wstawiłem więc wymaganą ALLOWED_HOSTSlistę do pliku setting.py i ... nic. Ten sam stary błąd 500. I nie, to nie był brak pliku 404.html.

Więc przez 2 dni zajmowałem się dzikimi teoriami, na przykład, że miało to coś wspólnego z serwowaniem plików statycznych (rozumiem, że jestem noobem i noobowie nie wiedzą, co robią).

Co to było? Teraz to moderator dochodzi do użytecznej wskazówki. Podczas gdy mój program Django to wersja 1.5. Coś, moja wersja serwera produkcyjnego to 1.5. Coś + 1 ... lub może plus 2. Cokolwiek. I tak po dodaniu ALLOWED_HOSTSdo desktopowej wersji pliku settings.py , w którym brakowało tego, o co prosił hwjp --- „domyślna wartość w settings.py, być może z komentarzem wyjaśniającym” --- zrobiłem to samo na serwerze produkcyjnym z właściwa do tego domena.

Ale nie zauważyłem, że na serwerze produkcyjnym z późniejszą wersją Django była domyślna wartość w settings.py z komentarzem wyjaśniającym. Było to znacznie poniżej miejsca, w którym dokonałem wpisu, poza zasięgiem wzroku na monitorze. I oczywiście lista była pusta. Stąd moja strata czasu.


1
Miałem dokładnie taki sam zabawny wzór! Z tą różnicą, że stało się to zabawne dopiero po tym, jak to znalazłem, dzięki. wcześniej było to po prostu frustrujące
binithb

Coś, co pomaga w tym wszystkim, to użyć local_settings.pydla każdego środowiska, a następnie zaimportować settings.py.
nicorellius

1
co lubię robić, to mieć katalog settings / zamiast settings.py. W tym katalogu możesz mieć osobne pliki .py dla różnych środowisk i plik base.py dla ustawień ogólnych. Ustawienia zależne od produkcji można następnie rozpocząć od zaimportowania * z ustawień podstawowych i po prostu zastąpić wszystko, co trzeba zastąpić. Ponadto wymagane init .py potrzebne do przekształcenia tego katalogu / ustawień w prawidłowy moduł może najpierw zaimportować z base.py, a następnie spróbować zaimportować z local.py (który istniałby tylko lokalnie). oznaczałoby to, że nie trzeba ręcznie określać ustawień lokalnych
mefisto

7

Uzupełnienie głównej odpowiedzi
Irytujące jest zmienianie globalnych stałych ALLOWED_HOSTS i DEBUG settings.pyprzy przełączaniu między rozwojem a produkcją. Używam tego kodu, aby automatycznie ustawić te ustawienia:

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

Jeśli używasz macOS, możesz napisać bardziej ogólny kod:

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

6

Za to, co jest warte - dostawałem 500 z tylko DEBUG = Falsena niektórych stronach. Śledzenie wyjątku za pomocą pdb ujawniło brakujący zasób (podejrzewam, {% static ... %}że winowajcą szablonu był winowajca 500).


1
To był mój problem, szablon podstawowy, do którego odwoływała się niestandardowa strona 404, używał tagu statycznego, ale nie zawierał {% load static%} u góry. Nie zauważyłem tego gdzie indziej, ponieważ moje inne szablony miały tę linię, ale sensownie jest umieścić ją w bazie, ponieważ odnosi się do plików statycznych w dowolnym miejscu.
krischan

2
To samo rozwiązanie tutaj - użyłem, staticaby dołączyć plik CSS, który nie istniał.
Phil Gyford,

5

Kiedy to zrobiłem, napotkałem ten sam problem DEBUG = FALSE. Oto skonsolidowane rozwiązanie przedstawione w powyższych odpowiedziach i innych postach.

Domyślnie w settings.py mamy ALLOWED_HOSTS = []. Oto możliwe zmiany, które należy wprowadzić ALLOWED_HOSTSwedług scenariusza, aby pozbyć się błędu:

1: Twoja nazwa domeny:

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

2: Twój wdrożony adres IP serwera, jeśli nie masz jeszcze nazwy domeny (co było moim przypadkiem i działało jak urok):

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

3: Jeśli testujesz na serwerze lokalnym, możesz edytować swój settings.pylub settings_local.pyjako:

ALLOWED_HOSTS = ['localhost', '127.0.0.1']

4: Możesz również podać „*” w ALLOWED_HOSTSwartości, ale nie jest to zalecane w środowisku produkcyjnym ze względów bezpieczeństwa:

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

Na moim blogu zamieściłem również szczegółowe rozwiązanie, które możesz polecić.


5

ALLOWED_HOSTS NIE jest jedynym problemem, dla mnie musiałem zrobić plik 404.html i umieścić go na poziomie podstawowym moich szablonów (nie na poziomie aplikacji) - Możesz także zrobić widok 404 i dodać adres URL modułu obsługi 404, ale myślę, że tak opcjonalny. 404.html to naprawiło

w mainproject.urls

handler404 = 'app.views.custom_404'

w app.views

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

następnie zrób szablon / 404.html szablon

otrzymałem to z innego postu S / O, że nie mogę go znaleźć

EDYTOWAĆ

dostaję również 500 błędów, gdy obsługuję zasoby za pomocą whitenoise. Nie mogłem zrozumieć, że przez całe życie mój błąd polegał na tym, że błąd ValueError spowodowany przez whitenoise nie mogąc znaleźć zasobu, którego ja również nie mogłem znaleźć, musiał na razie przejść z domyślnym serwerem django


8
Miałem ten sam problem z whitenoise. python manage.py collectstaticnaprawione.
Eugene Pakhomov

1
@ amchungh89 jesteś ratownikiem życia! Dzięki za wskazanie tego.
Deepak Sharma

5

Szukałem i testowałem więcej na temat tego problemu i zdałem sobie sprawę, że przyczyną mogą być katalogi plików statycznych określone w pliku settings.py, więc najpierw musimy uruchomić to polecenie

python manage.py collectstatic

w settings.py kod powinien wyglądać mniej więcej tak:

STATIC_URL = '/static/'

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

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

3

Wiem, że to bardzo stare pytanie, ale może mógłbym pomóc komuś innemu. Jeśli masz błąd 500 po ustawieniu DEBUG = False, zawsze możesz uruchomić manage.py runserver w wierszu poleceń, aby zobaczyć błędy, które nie pojawią się w żadnych internetowych dziennikach błędów.


2

Jest połowa 2019 roku i napotkałem ten błąd po kilku latach pracy z Django. Zaskoczyło mnie przez całą noc! Niedozwolony host (który powinien wyrzucić 400), wszystko inne wyewidencjonowane, w końcu wykonał pewne rejestrowanie błędów tylko po to, aby odkryć, że niektóre brakujące / lub pomieszane pliki statyczne (po collectstatic) psują się podczas instalacji. Krótko mówiąc, dla tych, którzy są zakłopotani I TAK SIĘ SZCZĘŚLIWIE WYKORZYSTUJĄ BIAŁE LUB BACKEND STATYSTYCZNY DJANGO Z DACHEM (manifest plików statycznych), może to jest dla Ciebie.

  1. Upewnij się, że wszystko skonfigurowałeś (tak jak ja zrobiłem dla backendu whitenoise ... backendy django czytaj dalej) http://whitenoise.evans.io/en/stable/django.html

  2. Jeśli kod błędu 500 nadal Cię strzela, zwróć uwagę na swoje ustawienia.STATICFILES_STORAGE.

Ustaw na oba (dla backendu whitenoise z kompresją)

STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'

lub (pozostaw jako domyślny django)

STATICFILES_STORAGE = django.contrib.staticfiles.storage.StaticFilesStorage

Podsumowując, PROBLEM wydawał się wynikać z faktu, że ta pamięć podręczna whitenoise + backend kompresji ->

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

lub własny backend buforowania django ->

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

... nie działało mi dobrze, ponieważ mój css odwoływał się do innych źródeł, które mogą być pomieszane podczas buforowania collectstatic / backend. Ten problem jest również potencjalnie podkreślony w http://whitenoise.evans.io/en/stable/django.html#storage-troubleshoot


1

Myślę, że mogą to być również ustawienia serwera http. Mój jest nadal zepsuty i miał ALLOWED_HOSTS przez cały czas. Mogę uzyskać do niego dostęp lokalnie (używam gunicorn), ale nie przez nazwę domeny, gdy DEBUG = False. kiedy próbuję użyć nazwy domeny, wtedy pojawia się błąd, więc myślę, że to problem związany z Nginx.

Oto mój plik conf dla 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;
}

mój plik konfiguracyjny gunicorn wygląda następująco: #! / bin / bash cd / var / web / delicms_env / deli_cms / source ../bin/activate exec gunicorn --workers = 3 deli_cms.wsgi: application
user2868304

mój problem został już rozwiązany, korzystałem ze skryptu gunicorn_django, który dawał mi przestarzałe wiadomości. Nadal nie jestem pewien, dlaczego działał lokalnie, nie zmieniłem mojej konfiguracji nginx, po prostu zmieniłem stary skrypt na gunicorn i zamiast tego użyłem modułu aplikacji wsgi: i działa ponownie. Gunicorn również przedtem publikował pewne informacje o zaniechaniu, ale nic konkretnego dla mojego problemu.
user2868304,

1

Mam podobny problem, w moim przypadku było to spowodowane umieszczeniem skomentowanego skryptu wewnątrz tagu body.

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

1

Natknąłem się na ten problem. Okazuje się, że dołączałem do szablonu, używając statictagu szablonu, pliku, który już nie istniał. Spojrzenie w dzienniki pokazało mi problem.

Myślę, że to tylko jedna z wielu możliwych przyczyn tego rodzaju błędu.

Morał tej historii: zawsze loguj błędy i zawsze sprawdzaj logi.


1

Dzięki @squarebear, w pliku dziennika, znalazłem błąd: ValueError: The file 'myapp/styles.css' could not be found with <whitenoise.storage.CompressedManifestStaticFilesStorage ...>.

Miałem kilka problemów z aplikacją django.
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'Usunąłem wiersz, który znalazłem z dokumentacji heroku.

Musiałem także dodać dodatkowy katalog (dzięki kolejnej odpowiedzi SO ) staticw katalogu głównym aplikacji django, myapp/staticmimo że go nie używałem. Następnie uruchomienie polecenia python manage.py collectstaticprzed uruchomieniem serwera rozwiązało problem. Wreszcie zaczęło działać dobrze.


Jak to odpowiada na pierwotne pytanie?
Nick

1

Zacząłem dostawać 500 za debugowanie = Fałsz w postaci

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

podczas podnoszenia django.core.exceptions.ValidationError zamiast podnoszenia rest_framework.serializers.ValidationError

Szczerze mówiąc, już wcześniej zbierał 500, ale jako ValidationError, z debug = False, zmieniło się to w NoReverseMatch.


1

to może pomóc komuś innemu, w moim przypadku problem z brakującym faviconem.


0

Wiem, że to stare pytanie, ale dostałem również błąd 500, gdy DEBUG = False. Po kilku godzinach zdałem sobie sprawę, że zapomniałem zakończyć niektóre linki w pliku base.html końcowym ukośnikiem.


nawet css i js?
amchugh89

0

To jest stare, a mój problem jest związany z problemem, ale nie dotyczy OP, ale moje rozwiązanie jest dla każdego, kto spróbowałby powyższego bezskutecznie.

Miałem ustawienie w zmodyfikowanej wersji Django, aby zminimalizować pliki CSS i JS, które działały tylko wtedy, gdy DEBUG był wyłączony. Mój serwer nie ma zainstalowanego minimalizatora CSS i zgłosił błąd. Jeśli używasz Django-Mako-Plus, może to być twój problem.


0

Należy zwrócić uwagę na jedną małą rzecz: jeśli w tablicy nie ma wartości None, wszystkie kolejne dozwolone hosty są ignorowane.

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

Trochę późno na imprezę i oczywiście może istnieć legion problemów, ale miałem podobny problem i okazało się, że miałem {%%} znaków specjalnych w mojej uwadze HTML ...

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

0

Miałem jeden widok, który zgłosił błąd 500 w debug = false, ale działał w debug = true. Dla każdego, kto dostaje coś takiego i Dozwolone hosty nie stanowią problemu, naprawiłem mój widok, aktualizując statyczny tag szablonu, który wskazywał niewłaściwą lokalizację.

Sugeruję więc po prostu sprawdzenie, czy linki i tagi są szczelne w każdym używanym szablonie, być może pewne rzeczy prześlizgują się przez sieć podczas debugowania, ale powodują błędy w produkcji.


0

Znalazłem jeszcze jedną przyczynę błędu 500, gdy DEBUG = False. Używam Django compressorużyteczność i nasze referencje dodanych front-end inżynier fontowe wewnątrz w compress cssbloku w szablonie Django. Lubię to:

{% 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 %}

Rozwiązaniem było przeniesienie łącza do ttfpliku poniżej endcompresslinii.


0

Miałem podobny problem i opiszę, jak rozwiązałem mój, ponieważ możliwe, że ktoś również doświadcza tego samego.

W moim przypadku błąd został spowodowany, ponieważ serwer nie znalazł niektórych plików statycznych ze strony głównej.

Upewnij się więc, że błąd występuje tylko na indexlub na innej stronie. Jeśli problem występuje tylko w indeksie, najprawdopodobniej musisz sprawdzić pliki statyczne. Zalecam otwarcie konsoli podglądu Chrome i sprawdzenie, czy nie ma błędów.

W moim przypadku serwer nie mógł znaleźć favicon.icoi dwa inne CSS.

Aby to naprawić, zdałem python manage.py collectstatici zadziałało.


0

Wiem, że ten post jest dość stary, ale nadal jest doskonale aktualny.

Za to, co jest warte - dostawałem 500 DEBUG = Falseza wszystkie strony w mojej witrynie.

Podczas debugowania nie otrzymałem żadnego śledzenia.

Musiałem przejrzeć każdy statyczny link w moich szablonach w mojej witrynie i znalazłem jeden / (ukośnik) przed moim źródłem obrazu. {% static ...%}. Spowodowało to błąd 500, DEBUG = Falseale działało idealnie Debug = Truebez błędów. Bardzo irytujące! Być ostrzeżonym! Wiele godzin straconych z powodu ukośnika ...


0

Może chcesz uruchomić python manage.py collectstaticpo ustawieniu DEBUG = Falsei ALLOWED_HOSTS = ['127.0.0.1']w settings.py. Po tych dwóch krokach moja aplikacja internetowa działała dobrze na moim lokalnym serwerze, nawet w trybie DEBUG = False.

BTW Mam te ustawienia w 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'

Zakładam, że może ustawienie whitenoise ma coś wspólnego z komendą kolektywną.


-3

Ok, po wypróbowaniu tylu rzeczy, poprawnym rozwiązaniem jest ...

musisz ustawić DEBUG = 'FALSE'nie Falselub FALSE, ale 'FALSE'z''


Myślę, że „FAŁSZ” jest ciągiem, więc jest równy Prawdzie, dlatego nie pojawia się błąd.
apet
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.