自定义Django 404错误

时间:2012-07-03 00:05:05

标签: django http-status-code-404

我有一个404.html页面,但在某些情况下我希望能够发送一条json错误消息(404和500等)。我阅读了以下页面:

https://docs.djangoproject.com/en/dev/topics/http/views/#the-404-page-not-found-view

是否有任何显示实施的示例?我在我的urls.py中有它,但是在发生错误时它没有被拾取。

3 个答案:

答案 0 :(得分:16)

这对我有用:

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

当你去那个控制器时,你可以按照自己的意愿做任何事情。

答案 1 :(得分:11)

除了上一个答案之外,重要的是要说views.py应该在http标头中返回一个404状态的HttpResponse。重要的是告知搜索引擎当前页面是404.垃圾邮件发送者有时会创建许多可能会引导您到某个地方的网址,但随后会为您提供其他内容。他们经常制作许多不同的地址,为您提供几乎完全相同的内容。而且由于它不是用户友好的,大多数SEO指南都会对此进行惩罚。因此,如果您有大量地址显示相同的伪404内容,则搜索网站的爬网系统看起来不太好。因此,您要确保您作为自定义404使用的页面具有404状态。所以这是一个很好的方式:

进入你的应用程序的urls.py add:

# 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

进入你的应用程序的views.py add:

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

秘密在最后一行:status = 404

希望它有所帮助!

我期待社区对此方法的投入。 =)

答案 2 :(得分:6)

基础:

要定义处理404错误的自定义视图,请在URL配置中定义handler404的视图,如handler404 = 'views.error404'

除了基础知识外,还需要注意一些事项(custom 404 views):

  1. 仅在Debug=False模式下启用。
  2. 在大多数答案中更多地忽略了一个(这就是我的大脑)。

    404视图默认为

      

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

    注意参数exception

    由于无法找到参数def get_exception_response(self, request, resolver, status_code, exception)

  3. ,导致core.handlers.base中定义的exception函数内的404到500重定向