2012-07-03 19 views

risposta

14

questo ha funzionato per me:

from django.conf.urls import patterns, include, url 
from django.views.static import * 
from django.conf import settings 
from django.conf.urls.defaults import handler404, handler500 
from app.views import error 

urlpatterns = patterns('', 
    # Examples: 
    # url(r'^$', 'app.views.home', name='home'), 
) 

handler404 = error.error_handler 
handler500 = error.error_handler 

Puoi fargli fare qualsiasi cosa come si desidera quando si va a tale controller.

10

In aggiunta alla risposta precedente, è importante dire che views.py deve restituire un HttpResponse con uno stato 404 nell'intestazione http. È importante informare i motori di ricerca che la pagina corrente è un 404. Gli spammer a volte creano molti URL che potrebbero portarti in qualche posto, ma poi ti offrono un altro contenuto. Spesso fanno molti indirizzi diversi che ti servono quasi esattamente lo stesso contenuto. E poiché non è facile da usare, la maggior parte delle linee guida SEO lo penalizzano. Quindi, se hai molti indirizzi che mostrano lo stesso contenuto di pseudo-404, non potrebbe apparire bello per i sistemi di scansione dai siti web di ricerca. Per questo motivo si desidera assicurarsi che la pagina che si sta utilizzando come una 404 personalizzata abbia uno stato 404. Così qui è un buon modo per andare:

Into urls.py aggiuntivo dell'applicazione:

# Imports 
from django.conf.urls.static import static 
from django.conf.urls import handler404 
from django.conf.urls import patterns, include, url 
from yourapplication import views 

## 
# Handles the URLS calls 
urlpatterns = patterns('', 
    # url(r'^$', include('app.homepage.urls')), 
) 

handler404 = views.error404 

Into views.py aggiuntivo dell'applicazione:

# Imports 
from django.shortcuts import render 
from django.http import HttpResponse 
from django.template import Context, loader 


## 
# Handle 404 Errors 
# @param request WSGIRequest list with all HTTP Request 
def error404(request): 

    # 1. Load models for this view 
    #from idgsupply.models import My404Method 

    # 2. Generate Content for this view 
    template = loader.get_template('404.htm') 
    context = Context({ 
     'message': 'All: %s' % request, 
     }) 

    # 3. Return Template for this view + Data 
    return HttpResponse(content=template.render(context), content_type='text/html; charset=utf-8', status=404) 

Il segreto è in ultima line: status = 404

Spero che abbia aiutato!

Non vedo l'ora di vedere gli input della comunità a questo approccio. =)

+0

Viene visualizzato "impossibile importare le viste dei nomi" durante la scrittura "da viste di importazione app1" in "views.py". Il nome della mia app è "app1" – Timo

+0

urls.py dell'applicazione significa: Se si dispone di un progetto 'sito Web' e di un'app' blog'. Quindi dovresti aggiungere 'handler404' in 'website.urls.py' not' blog.urls.py' –

4

Basics:

per definire visualizzazione personalizzata per la gestione di errori 404, definire nella configurazione URL, una vista per handler404, come handler404 = 'views.error404'

A parte le nozioni di base, alcune cose da notare su (custom 404 views):

  1. Sarà abilitato solo nella modalità Debug=False.
  2. E più uno ignorato, attraverso la maggior parte delle risposte (e questo mi ha conficcato il cervello).

    I 404 vista default

    django.views.defaults.page_not_found(request, exception, template_name='404.html')

    Avviso parametro exception

    Questo stava causando un 404-500 reindirizzare dall'interno def get_exception_response(self, request, resolver, status_code, exception) funzione definita in core.handlers.base dal momento che non riusciva a trovare il parametro exception