2012-07-03 23 views

Respuesta

14

Esto funcionó para mí:

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 

Puede hacer que haga cualquier cosa que desee cuando se va a ese controlador.

10

Además de la respuesta anterior, es importante decir que views.py debe devolver una HttpResponse con un estado 404 en el encabezado http. Es importante informar a los motores de búsqueda que la página actual es un 404. Los spammers a veces crean muchas URL que podrían parecer que lo llevarían a algún lugar, pero luego le sirven otro contenido. Con frecuencia hacen que muchas direcciones diferentes le brinden casi el mismo contenido. Y debido a que no es fácil de usar, la mayoría de las líneas de guía de SEO penalizan eso. Por lo tanto, si tiene muchas direcciones que muestran el mismo contenido pseudo-404, no podría verse bien en los sistemas de rastreo de los sitios web de búsqueda. Por eso, debe asegurarse de que la página que está sirviendo como un 404 personalizado tenga un estado 404. Así que aquí es una buena manera de ir:

En urls.py complemento de la aplicación:

# 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 

En views.py complemento de la aplicación:

# 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) 

El secreto está en la última línea: estado = 404

Espero que haya sido útil.

Espero con interés las aportaciones de la comunidad a este enfoque. =)

+0

Obtengo "no puedo importar vistas de nombre" cuando escribo "desde vistas de importación de app1" en "views.py". El nombre de mi aplicación es "app1" – Timo

+0

Urls.py de la aplicación significa: si tiene un 'sitio web' del proyecto y un' blog' de la aplicación. Entonces deberías agregar 'handler404' en 'website.urls.py' no' blog.urls.py' –

4

básico:

para definir vista personalizada para el manejo de errores 404, definir en la configuración de URL, una vista para handler404, como handler404 = 'views.error404'

Además de los conceptos básicos, algunas cosas a tener en cuenta sobre (custom 404 views):

  1. Se habilitará solo en el modo Debug=False.
  2. Y más ignorado, en la mayoría de las respuestas (y esto me sacó los sesos).

    los 404 Ver predeterminados a

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

    Aviso el parámetro exception

    Esto causaba un 404-500 redirigen desde dentro def get_exception_response(self, request, resolver, status_code, exception) función definida en core.handlers.base ya que no pudo encontrar el parámetro exception

Cuestiones relacionadas