Establecer DEBUG = False causa 500 Error

Una vez que cambie DEBUG = False , mi sitio generará 500 (usando wsgi & manage.py runserver), y no hay información de error en el registro de errores de Apache y se ejecutará normalmente cuando cambie la debug a True .

Estoy usando Django 1.5 & Python 2.7.3 aquí es el registro de acceso de Apache y sin ningún registro en el registro de errores de 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" 

Aquí está mi archivo de configuración:

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

Django 1.5 introdujo la configuración de hosts permitidos que se requiere por razones de seguridad. Un archivo de configuración creado con Django 1.5 tiene esta nueva sección que debe agregar:

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

Agregue su host aquí como ['www.beta800.net'] o ['*'] para una prueba rápida, pero no use ['*'] para la producción .

Sé que es tarde pero terminé aquí con una búsqueda de mi error 500 con DEBUG=False , en mi caso resultó ser ALLOWED_HOSTS pero estaba usando os.environ.get('variable') para llenar el hosts, no lo noté hasta que habilité el registro, puede registrar todos los errores en el archivo con el siguiente y se registrará incluso cuando 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', }, } } 

En mi caso, leer documentos de aplicaciones de terceros me salvó correctamente.

¿El culpable? django_compressor

tuve

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

DEBUG = True siempre me dio 500. Para solucionarlo, necesitaba una línea en mi configuración para ejecutarlo

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

Correcto, en Django 1.5 si DEBUG = False, configure ALLOWED_HOSTS, agregando dominios sin el número de puerto. ejemplo:

 ALLOWED_HOSTS = ['localhost'] 

También debe verificar sus URL en cualquier lugar. Cuando el DEBUG se establece en False , todas las URL sin seguimiento / son tratadas como un error, a diferencia de cuando se tiene DEBUG = True , en cuyo caso Django lo agregará / todas partes faltará. Entonces, en resumen, asegúrese de que todos los enlaces terminen con un barra por TODAS PARTES.

Me encontré con el mismo problema recientemente en Django 2.0. Pude resolver el problema estableciendo DEBUG_PROPAGATE_EXCEPTIONS = True . Vea aquí: https://docs.djangoproject.com/en/2.0/ref/settings/#debug-propagate-exceptions

En mi caso, el error fue ValueError: Missing staticfiles manifest entry for 'admin/css/base.css' . Lo arreglé ejecutando localmente python manage.py collectstatic .

Tengo una historia hilarante para todos. Después de llegar a esta página, dije: “Eureka, estoy salvado, ese debe ser mi problema”. Así que ALLOWED_HOSTS lista ALLOWED_HOSTS requerida en setting.py y … nada. El mismo viejo error 500. Y no, no fue por falta de un archivo 404.html.

Así que durante 2 días me ocupé de teorías descabelladas, como que tenía algo que ver con el servicio de archivos estáticos (entiendo que soy un novato y los noobs no saben lo que están haciendo).

Entonces, ¿qué fue? Ahora es el Sr. Moderador que llegamos a un consejo útil. Mientras que mi desarrollo Django es la versión 1.5.algo, mi versión del servidor de producción es 1.5.algo + 1 … o tal vez más 2. Lo que sea. Y después de que agregué ALLOWED_HOSTS a la versión de escritorio de settings.py , que carecía de lo que hwjp solicitó — un “valor predeterminado en settings.py, quizás con un comentario explicativo” — hice lo mismo en el servidor de producción con el dominio adecuado para ello.

Pero no me di cuenta de que en el servidor de producción con la última versión de Django, había un valor predeterminado en settings.py con un comentario explicativo. Estaba muy por debajo de donde hice mi entrada, fuera de la vista en el monitor. Y, por supuesto, la lista estaba vacía. De ahí mi pérdida de tiempo.

Me enfrenté al mismo problema cuando hice DEBUG = FALSE . Aquí hay una solución consolidada tal como se dispersa en las respuestas anteriores y en otras publicaciones.

Por defecto, en settings.py tenemos ALLOWED_HOSTS = [] . Aquí hay posibles cambios que deberá realizar en el valor de ALLOWED_HOSTS según el escenario para eliminar el error:

1: Su nombre de dominio:

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

2: su IP de servidor desplegado si aún no tiene un nombre de dominio (que era mi caso y funcionó como un amuleto):

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

3: Si está probando en un servidor local, puede editar su settings.py o settings_local.py como:

 ALLOWED_HOSTS = ['localhost', '127.0.0.1'] 

4: también puede proporcionar ‘*’ en el valor ALLOWED_HOSTS pero no se recomienda en el entorno de producción debido a razones de seguridad:

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

También publiqué una solución detallada en mi blog a la que puede referir.

Por lo que vale, estaba obteniendo un 500 con DEBUG = False en algunas páginas solamente. Rastrear la excepción con pdb reveló un activo perdido (sospecho que la etiqueta de la plantilla {% static ... %} fue la culpable del 500.

Complementando la respuesta principal
Es molesto cambiar las constantes globales ALLOWED_HOSTS y DEPURAR en settings.py al cambiar entre desarrollo y producción. Estoy usando este código para establecer estas configuraciones automáticamente:

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

Si usa macOS, podría escribir un código más genérico:

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

ALLOWED_HOSTS NO es el único problema, para mí tuve que hacer un 404.html y ponerlo en el nivel base de mis plantillas (no a nivel de aplicación). También, puedes hacer una vista 404 y agregar una url 404handler, pero creo que eso es todo. Opcional. 404.html lo arregló

en mainproject.urls

 handler404 = 'app.views.custom_404' 

en app.views

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

luego crea una plantilla templates / 404.html

obtuve esto de otra publicación de S / O que no puedo encontrar

EDITAR

Además, recibo 500 errores cuando presento activos con whitenoise. No pude entender eso por mi vida, el error fue que ValueError de whitenoise no pudo encontrar un activo que tampoco pude encontrar, tenía que ir con el servidor django predeterminado por ahora

Sé que esta es una vieja pregunta, pero quizás podría ayudar a alguien más. Si tiene un error de 500 después de establecer DEBUG = False, siempre puede ejecutar el manage.py runserver en la línea de comandos para ver cualquier error que no aparezca en ningún registro de errores web.

Estaba buscando y probando más sobre este tema y me di cuenta de que las direcciones de archivos estáticos especificados en settings.py pueden ser una causa de esto, así que primero tenemos que ejecutar este comando

 python manage.py collecstatic 

en settings.py, el código debería verse más o menos así:

 STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 

Creo que también podría ser la configuración del servidor http. El mío todavía está roto y tenía ALLOWED_HOSTS todo el tiempo. Puedo acceder a él localmente (uso gunicornio), pero no a través del nombre de dominio cuando DEBUG = False. cuando trato de usar el nombre de dominio, entonces me da el error, así que me hace pensar que es un problema relacionado con nginx.

Aquí está mi archivo conf para 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; } 

Tengo el problema similar, en mi caso fue causado por tener una secuencia de comandos Commentada dentro de la etiqueta del cuerpo.

  

Me encontré con este problema. Resulta que estaba incluido en la plantilla, usando la etiqueta de plantilla static , un archivo que ya no existía. Una mirada en los registros me mostró el problema.

Supongo que esta es solo una de las muchas razones posibles para este tipo de error.

Moraleja de la historia: siempre registra errores y siempre revisa los registros.

Gracias a @squarebear, en el archivo de registro, encontré el error: ValueError: The file 'myapp/styles.css' could not be found with .

Tuve algunos problemas en mi aplicación django. Eliminé la línea
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' que encontré en la documentación del heroku.

También tuve que agregar un directorio adicional (gracias a otra respuesta SO ) static en la raíz de la aplicación django como myapp/static aunque no lo estaba usando. Luego, al ejecutar el comando python manage.py collectstatic antes de ejecutar el servidor, se solucionó el problema. Finalmente, comenzó a funcionar bien.

Sé que esta es una vieja pregunta, pero también recibí un error de 500 cuando DEBUG = False. Después de varias horas, me di cuenta de que había olvidado terminar algunos de los enlaces en mi base.html con una barra al final.

Esto es viejo y mi problema terminó relacionado con el problema, pero no con el OP, pero mi solución es para cualquier otra persona que haya intentado lo anterior sin ningún resultado.

Tenía una configuración en una versión modificada de Django para minimizar los archivos CSS y JS que solo se ejecutaban cuando DEBUG estaba desactivado. Mi servidor no tenía el minificador de CSS instalado y lanzó el error. Si está utilizando Django-Mako-Plus, este podría ser su problema.

Una pequeña cosa a tener en cuenta, si la matriz tiene None en ella, entonces se ignoran todos los hosts permitidos posteriores.

 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

Un poco tarde para la fiesta y, por supuesto, podría haber una legión de problemas, pero he tenido un problema similar y resultó que tenía {%%} caracteres especiales dentro de mi comentario html …

  

Tenía una vista que arrojó un error 500 en debug = false pero funcionó en debug = true. Para cualquiera que esté recibiendo este tipo de cosas y Hosts Permitidos no es el problema, arreglé mi vista actualizando la etiqueta estática de una plantilla que apuntaba a la ubicación incorrecta.

Así que sugiero que solo revise los enlaces y las tags sean herméticas en cualquier plantilla utilizada, tal vez ciertas cosas se filtren a través de la red en la depuración pero den errores en la producción.

Encontré una causa más del error 500 cuando DEBUG = False. Utilizo la utilidad del compressor Django y nuestro ingeniero front-end agregó referencias a los archivos de fonts dentro de un bloque compress css en una plantilla de Django. Me gusta esto:

 {% compress css %}     {% endcompress %} 

La solución fue mover el enlace al archivo ttf debajo de la línea de endcompress .

Si desea permitir todos los hosts. Utilice ALLOWED_HOSTS = [‘*’,] en lugar de ALLOWED_HOSTS = [‘*’]