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
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
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
.
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
_.
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.
Ajouter ces lignes dans 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.
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
# ...
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.
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é.
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.
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.
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.
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)
# 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.
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.