Siguiendo el tutorial que se encuentra aquí exactamente, no puedo crear una página de error personalizada 500 o 404. Si escribo una URL incorrecta, la página me da la página de error predeterminada. ¿Hay algo que deba comprobar que evite que aparezca una página personalizada?
Directorios de archivos:
mysite/
mysite/
__init__.py
__init__.pyc
settings.py
settings.pyc
urls.py
urls.pyc
wsgi.py
wsgi.pyc
polls/
templates/
admin/
base_site.html
404.html
500.html
polls/
detail.html
index.html
__init__.py
__init__.pyc
admin.py
admin.pyc
models.py
models.pyc
tests.py
urls.py
urls.pyc
view.py
views.pyc
templates/
manage.py
dentro de mysite / settings.py tengo estos habilitados:
DEBUG = False
TEMPLATE_DEBUG = DEBUG
#....
TEMPLATE_DIRS = (
'C:/Users/Me/Django/mysite/templates',
)
dentro de mysite / polls / urls.py:
from django.conf.urls import patterns, url
from polls import views
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
)
Puedo publicar cualquier otro código necesario, pero ¿qué debo cambiar para obtener una página de error 500 personalizada si uso una URL incorrecta?
Editar
SOLUCIÓN: Tuve un adicional
TEMPLATE_DIRS
dentro de mi settings.py y eso estaba causando el problema
Respuestas:
Debajo de su principal,
views.py
agregue su propia implementación personalizada de las siguientes dos vistas, y simplemente configure las plantillas 404.html y 500.html con lo que desea mostrar.Con esta solución, no es necesario agregar ningún código personalizado a
urls.py
Aquí está el código:
Actualizar
handler404
yhandler500
se exportan las variables de configuración de cadenas de Django que se encuentran endjango/conf/urls/__init__.py
. Es por eso que funciona la configuración anterior.Para que la configuración anterior funcione, debe definir las siguientes variables en su
urls.py
archivo y apuntar las variables de Django exportadas a la ruta de Python de cadena de donde se definen estas vistas funcionales de Django, así:Actualización para Django 2.0
Las firmas para las vistas del controlador se cambiaron en Django 2.0: https://docs.djangoproject.com/en/2.0/ref/views/#error-views
Si usa vistas como arriba, handler404 fallará con el mensaje:
En tal caso, modifique sus vistas de esta manera:
fuente
500 template
no se procesarárequest.user
porque informa un error de servidor 500, por lo que el servidor no puede ofrecer nada.Respuesta oficial:
Aquí está el enlace a la documentación oficial sobre cómo configurar vistas de error personalizadas:
https://docs.djangoproject.com/en/stable/topics/http/views/#customizing-error-views
Dice que agregue líneas como estas en su URLconf (configurarlas en cualquier otro lugar no tendrá ningún efecto):
También puede personalizar la vista de errores CSRF modificando la configuración
CSRF_FAILURE_VIEW
.Controladores de errores predeterminados:
Vale la pena leer la documentación de los controladores de errores por omisión,
page_not_found
,server_error
,permission_denied
ybad_request
. De manera predeterminada, utilizan estas plantillas si pueden encontrarlos, respectivamente:404.html
,500.html
,403.html
, y400.html
.Entonces, si todo lo que quiere hacer es crear páginas de error bonitas, simplemente cree esos archivos en un
TEMPLATE_DIRS
directorio, no necesita editar URLConf en absoluto. Lea la documentación para ver qué variables de contexto están disponibles.En Django 1.10 y versiones posteriores, la vista de error CSRF predeterminada usa la plantilla
403_csrf.html
.Gotcha:
No olvide que
DEBUG
debe establecerse en False para que funcionen, de lo contrario, se utilizarán los controladores de depuración normales.fuente
Agregue estas líneas en urls.py
urls.py
e implementar nuestras vistas personalizadas en views.py.
views.py
fuente
handler400
solo para sobrescribirlohandler400 = 'myapp.views.bad_request'
?render_to_response
. De los documentos: "no se recomienda y es probable que quede obsoleto en el futuro".render_to_response
que estará obsoleto, consulte lo siguiente (userender
en su lugar): stackoverflow.com/questions/44228397/…De la página a la que hizo referencia:
Entonces creo que debes agregar algo como esto a tu urls.py:
y similar para handler500.
fuente
urlpatterns = ...
línea, agregue una línea que digahandler500 = 'views.handle500'
, y luego agreguedef handle500(request):
a su views.py que muestra su 500.html.Si todo lo que necesita es mostrar páginas personalizadas que tienen algunos mensajes de error elegantes para su sitio cuando
DEBUG = False
, agregue dos plantillas llamadas 404.html y 500.html en su directorio de plantillas y automáticamente recogerá estas páginas personalizadas cuando un 404 o 500 es elevado.fuente
'DIRS': [os.path.join(BASE_DIR, '<project_name>/templates')]
en su lista de PLANTILLAS en formatosettings.py
.En Django 2. * puedes usar esta construcción en views.py
En settings.py
En urls.py
Por lo general, creo default_app y manejo errores en todo el sitio, procesadores de contexto en él.
fuente
exception
?locals()
? El archivo solo muestrapass
.settings.py:
y simplemente agregue sus páginas
404.html
y500.html
en la carpeta de plantillas. eliminar404.html
y500.html
de las plantillas en la aplicación de encuestas.fuente
raise Http404('msg')
: stackoverflow.com/a/37109914/895245{{ request_path }}
.Comete un error, en la página de error averigüe desde dónde está cargando django las plantillas. Me refiero a la pila de rutas. En base template_dir agregue estas páginas html 500.html , 404.html . Cuando ocurren estos errores, los archivos de plantilla respectivos se cargarán automáticamente.
También puede agregar páginas para otros códigos de error, como 400 y 403 .
Espero que esto ayude !!!
fuente
En Django
3.x
, la respuesta aceptada no funcionará porquerender_to_response
se ha eliminado por completo y se han realizado algunos cambios más desde la versión para la que funcionó la respuesta aceptada.Algunas otras respuestas también están allí, pero presento una respuesta un poco más limpia:
En su
urls.py
archivo principal :En
yourapp/views.py
archivo:Asegúrese de haber importado
render()
enyourapp/views.py
archivo:Nota al margen:
render_to_response()
quedó obsoleto en Django2.x
y se ha eliminado por completo en la versión3.x
.fuente
Como una sola línea (para la página 404 genérica):
fuente
Esto funciona en django 2.0
Asegúrese de incluir su personalizado
404.html
dentro de la carpeta de plantillas de la aplicación.fuente
Django 3.0
aquí hay un enlace sobre cómo personalizar las vistas de error
aquí hay un enlace sobre cómo renderizar una vista
en el
urls.py
(el principal, en la carpeta del proyecto), ponga:y en esa aplicación (
my_app_name
) pongaviews.py
:NOTA:
error/404.html
es la ruta si coloca sus archivos en la carpeta de plantillas de proyectos (no en las aplicaciones),templates/errors/404.html
así que coloque los archivos donde desee y escriba la ruta correcta.NOTA 2: Después de volver a cargar la página, si aún ve la plantilla anterior, cámbiela
settings.py
DEBUG=True
, guárdela y luego vuelva aFalse
(para reiniciar el servidor y recopilar los archivos nuevos).fuente
DEUB=False
sus archivos estáticos, es posible que no se sirvan, por lo que no puede obtener una vista previa de los cambios de la plantilla de error personalizada. Úselo./manage.py runserver --insecure
para forzar a django a servirlos de todos modos.No se requiere vista adicional. https://docs.djangoproject.com/en/3.0/ref/views/
Simplemente coloque los archivos de error en la raíz del directorio de plantillas
Y debería usar su página de error cuando la depuración es Falsa
fuente
Intente mover sus plantillas de error a
.../Django/mysite/templates/
?Estoy seguro de esto, pero creo que deben ser "globales" para el sitio web.
fuente