10

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

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

有什么例子可以显示实现吗?我在我的 urls.py 中有它,但如果发生错误,它不会被拾取。

4

3 回答 3

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

当你去那个控制器时,你可以让它做任何你想做的事情。

于 2012-07-03T00:06:40.537 回答
12

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

在您的应用程序的 urls.py 中添加:

# 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 中添加:

# 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

希望它有所帮助!

我期待看到社区对这种方法的投入。=)

于 2013-04-26T13:55:19.093 回答
6

基本:

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

除了基础知识之外,还有一些需要注意的事项(自定义 404 视图):

  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)定义的函数内进行 404 到 500 重定向,core.handlers.base因为它找不到参数exception

于 2016-09-29T13:28:08.840 回答