152 votes

Django, création d'une page d'erreur 500/404 personnalisée

En suivant le tutoriel trouvé aquí exactement, je ne peux pas créer une page d'erreur 500 ou 404 personnalisée. Si je tape une mauvaise URL, la page me donne la page d'erreur par défaut. Y a-t-il quelque chose que je devrais vérifier et qui empêcherait l'affichage d'une page personnalisée ?

Répertoires de fichiers :

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

Dans le fichier mysite/settings.py, je les ai activés :

DEBUG = False
TEMPLATE_DEBUG = DEBUG

#....

TEMPLATE_DIRS = (
    'C:/Users/Me/Django/mysite/templates', 
)

dans le fichier 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'),
)

Je peux afficher tout autre code nécessaire, mais que dois-je changer pour obtenir une page d'erreur 500 personnalisée si j'utilise une mauvaise url ?

Modifier

SOLUTION : J'ai eu un supplément

TEMPLATE_DIRS

dans mon fichier settings.py et c'est ce qui a causé le problème.

145voto

Aron Ysidoro Points 922

Sous votre principal views.py ajoutez votre propre implémentation personnalisée des deux vues suivantes, et configurez simplement les gabarits 404.html y 500.html avec ce que vous voulez afficher.

Avec cette solution, il n'est pas nécessaire d'ajouter du code personnalisé à l'application urls.py

Voici le code :

from django.shortcuts import render_to_response
from django.template import RequestContext

def handler404(request, *args, **argv):
    response = render_to_response('404.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 404
    return response

def handler500(request, *args, **argv):
    response = render_to_response('500.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 500
    return response

Mise à jour

handler404 y handler500 sont des variables de configuration de chaîne Django exportées qui se trouvent dans django/conf/urls/__init__.py . C'est pourquoi la configuration ci-dessus fonctionne.

Pour que la configuration ci-dessus fonctionne, vous devez définir les variables suivantes dans votre fichier urls.py et faites pointer les variables Django exportées vers le chemin Python de la chaîne où ces vues fonctionnelles Django sont définies, comme suit :

# project/urls.py

handler404 = 'my_app.views.handler404'
handler500 = 'my_app.views.handler500'

Mise à jour pour Django 2.0

Les signatures pour les vues de gestionnaire ont été modifiées dans Django 2.0 : https://docs.djangoproject.com/en/2.0/ref/views/#error-views

Si vous utilisez les vues comme ci-dessus, le handler404 échouera avec le message :

"handler404() a reçu un argument mot-clé inattendu 'exception'"

Dans ce cas, modifiez votre point de vue comme suit :

def handler404(request, exception, template_name="404.html"):
    response = render_to_response(template_name)
    response.status_code = 404
    return response

116voto

Flimm Points 8870

Réponse officielle :

Voici le lien vers la documentation officielle sur la façon de configurer des vues d'erreurs personnalisées :

https://docs.djangoproject.com/en/stable/topics/http/views/#customizing-error-views

Il est indiqué d'ajouter des lignes comme celles-ci dans votre URLconf (les définir ailleurs n'aura aucun effet) :

handler404 = 'mysite.views.my_custom_page_not_found_view'
handler500 = 'mysite.views.my_custom_error_view'
handler403 = 'mysite.views.my_custom_permission_denied_view'
handler400 = 'mysite.views.my_custom_bad_request_view'

Vous pouvez également personnaliser l'affichage de l'erreur CSRF en modifiant le paramètre CSRF_FAILURE_VIEW .

Gestionnaires d'erreurs par défaut :

Il vaut la peine de lire la documentation des gestionnaires d'erreurs par défaut, page_not_found , server_error , permission_denied y bad_request . Par défaut, ils utilisent ces modèles s'ils peuvent les trouver, respectivement : 404.html , 500.html , 403.html et 400.html .

Donc, si tout ce que vous voulez faire est de créer de jolies pages d'erreur, créez simplement ces fichiers dans un fichier TEMPLATE_DIRS vous n'avez pas besoin de modifier URLConf du tout. Lisez la documentation pour savoir quelles variables contextuelles sont disponibles.

Dans Django 1.10 et plus, la vue par défaut de l'erreur CSRF utilise le modèle 403_csrf.html .

Je t'ai eu :

N'oubliez pas que DEBUG doit être défini à False pour que cela fonctionne, sinon, les gestionnaires de débogage normaux seront utilisés.

55voto

Armance Wissal Points 1575

Ajoutez ces lignes dans urls.py

urls.py

from django.conf.urls import (
handler400, handler403, handler404, handler500
)

handler400 = 'my_app.views.bad_request'
handler403 = 'my_app.views.permission_denied'
handler404 = 'my_app.views.page_not_found'
handler500 = 'my_app.views.server_error'

# ...

et implémenter nos vues personnalisées dans views.py.

vues.py

from django.shortcuts import (
render_to_response
)
from django.template import RequestContext

# HTTP Error 400
def bad_request(request):
    response = render_to_response(
        '400.html',
        context_instance=RequestContext(request)
        )

        response.status_code = 400

        return response

# ...

47voto

elano7 Points 397

Django 3.0+ 4.0+.

voici lien comment personn personn personnaliser les personn personn personn personn personn personn personn personn personn personn personn personn

voici lien comment rendre une vue

dans le urls.py (le principal, dans le dossier du projet ), mettez :

handler404 = 'my_app_name.views.custom_page_not_found_view'
handler500 = 'my_app_name.views.custom_error_view'
handler403 = 'my_app_name.views.custom_permission_denied_view'
handler400 = 'my_app_name.views.custom_bad_request_view'

et dans l'application mentionnée ( my_app_name ) mis dans le views.py :

def custom_page_not_found_view(request, exception):
    return render(request, "errors/404.html", {})

def custom_error_view(request, exception=None):
    return render(request, "errors/500.html", {})

def custom_permission_denied_view(request, exception=None):
    return render(request, "errors/403.html", {})

def custom_bad_request_view(request, exception=None):
    return render(request, "errors/400.html", {})

NOTE : errors/404.html est le chemin d'accès si vous placez vos fichiers dans le dossier modèle des projets (et non des applications). templates/errors/404.html Veuillez donc placer les fichiers où vous voulez et écrire le bon chemin.

NOTE 2 : Après le rechargement de la page, si vous voyez toujours l'ancien modèle, changez dans settings.py DEBUG=True , l'enregistrer, puis à nouveau à False et sauvegarder à nouveau (cela redémarrera le serveur et collectera les nouveaux fichiers).

23voto

Mike Pelley Points 1603

De la page que vous avez référencée :

Lorsque vous déclenchez Http404 à partir d'une vue, Django charge une vue spéciale consacrée à la gestion des erreurs 404. Il la trouve en recherchant la variable handler404 dans votre URLconf racine (et uniquement dans votre URLconf racine ; définir handler404 ailleurs n'aura aucun effet), qui est une chaîne de caractères en syntaxe Python en pointillés - le même format que les callbacks URLconf normaux. Une vue 404 en elle-même n'a rien de spécial : c'est juste une vue normale.

Je pense donc que vous devez ajouter quelque chose comme ceci à votre urls.py :

handler404 = 'views.my_404_view'

et similaire pour handler500.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X