web-dev-qa-db-fra.com

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

Suite au tutoriel trouvé ici exactement, je ne peux pas créer de page d'erreur personnalisée 500 ou 404. 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 pour empêcher une page personnalisée de s'afficher?

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 mysite/settings.py, je les ai activés:

DEBUG = False
TEMPLATE_DEBUG = DEBUG

#....

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

dans 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 poster tout autre code nécessaire, mais que dois-je changer pour obtenir une page d'erreur personnalisée 500 si j'utilise une mauvaise URL?

Modifier

SOLUTION: J'ai eu un autre

TEMPLATE_DIRS

au sein de mon settings.py et qui causait le problème

80
Zac

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

Avec cette solution, aucun code personnalisé ne doit être ajouté à 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

Mettre à jour

handler404 et handler500 sont exportés Django variables de configuration de chaîne trouvées 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 pointer les variables exportées Django vers la chaîne Python chemin d’où elles Django les vues fonctionnelles 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 du 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, handler404 échouera avec le message suivant:

"handler404 () a un argument de mot clé inattendu 'exception'"

Dans ce cas, modifiez vos vues comme ceci:

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

Réponse officielle:

Voici le lien vers la documentation officielle sur la configuration de vues d'erreur personnalisées:

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

Il est dit d’ajouter des lignes comme celles-ci dans votre URLconf (les placer 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 la vue d'erreur CSRF en modifiant le paramètre CSRF_FAILURE_VIEW .

Gestionnaires d'erreur par défaut:

Il vaut la peine de lire la documentation des gestionnaires d’erreur par défaut, page_not_found , server_error , permission_denied et 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 vous ne voulez que créer de jolies pages d'erreur, créez simplement ces fichiers dans un répertoire _TEMPLATE_DIRS_, vous n'avez pas besoin de modifier URLConf. Lisez la documentation pour voir quelles variables de contexte sont disponibles.

Dans Django 1.10 et versions ultérieures, la vue d'erreur CSRF par défaut utilise le modèle _403_csrf.html_.

Je t'ai eu:

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

53
Flimm

Ajouter 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.

views.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

# ...
33
Armance

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

Lorsque vous élevez Http404 depuis une vue, Django chargera une vue spéciale consacrée à la gestion des erreurs 404. Il le trouve en recherchant la variable handler404 dans votre URLconf racine (et uniquement dans votre URLconf racine; définir handler404 n’aura aucun effet), qui est une chaîne dans la syntaxe Python en pointillé - le même format les rappels normaux d'URLconf utilisent. Une vue 404 n’a rien de spécial en soi: c’est 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.

19
Mike Pelley

Si tout ce dont vous avez besoin est d’afficher des pages personnalisées contenant des messages d’erreur sophistiqués pour votre site lorsque DEBUG = False, puis ajoutez deux modèles nommés 404.html et 500.html dans votre répertoire de modèles. quand un 404 ou 500 est élevé.

18
Krishna G Nair

Pour Django 2 suivez ces étapes.

Modifiez votre fichier project/settings.py afin qu'il ressemble à ceci:

DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1','localhost']

Ajoutez ceci à views.py:

def error_404_view(request, exception):
    return render(request,'myapp/404.html')

Créez un fichier personnalisé 404.html.

Allez maintenant dans le fichier urls.py de votre projet et ajoutez cette ligne après urlpatterns:

handler404 = 'myapp.views.error_404_view'

Maintenant, si vous allez sur votre navigateur et ouvrez une URL inexistante, une page d'erreur 404 personnalisée s'affichera.

14
Alex Jolig

settings.py ::::

DEBUG = False
TEMPLATE_DEBUG = DEBUG
ALLOWED_HOSTS = ['localhost']  #provide your Host name

et ajoutez simplement vos pages 404.html et 500.html dans le dossier des modèles. supprimez les modèles 404.html et 500.html des modèles dans l'application de sondage.

9
Rakesh babu

Dans Django 2. * vous pouvez utiliser cette construction dans views.py

def handler404(request, exception):
    return render(request, 'errors/404.html', locals())

Dans settings.py

DEBUG = False

if DEBUG is False:
    ALLOWED_HOSTS = [
        '127.0.0.1:8000',
        '*',
    ]

if DEBUG is True:
    ALLOWED_HOSTS = []

Dans rls.py

# https://docs.djangoproject.com/en/2.0/topics/http/views/#customizing-error-views
handler404 = 'YOUR_APP_NAME.views.handler404'

Habituellement, je crée default_app et gère les erreurs de site, ainsi que les processeurs de contexte.

8
DeN

Sur une seule ligne (pour 404 pages génériques):

from Django.shortcuts import render_to_response
from Django.template import RequestContext

return render_to_response('error/404.html', {'exception': ex},
                                      context_instance=RequestContext(request), status=404)
5
FireZenk
# views.py
def handler404(request, exception):
    context = RequestContext(request)
    err_code = 404
    response = render_to_response('404.html', {"code":err_code}, context)
    response.status_code = 404
    return response

# <project_folder>.urls.py
handler404 = 'todo.views.handler404' 

Cela fonctionne sur Django 2.0

Veillez à inclure votre 404.html personnalisé dans le dossier des modèles d'application.

4

Essayez de déplacer vos modèles d'erreur vers .../Django/mysite/templates/?

Je ne suis pas sûr à propos de celui-ci, mais je pense que ces sites doivent être "globaux" sur le site.

3
astrognocci