5

我正在阅读 Django 教程,并在第 5 部分:测试。我遇到了使用 DetailView 和 ListView “快捷方式”视图来分解代码的问题(如教程所建议的那样),但是当显示 404 页面时,会返回 200 状态代码。难道我做错了什么?教程说状态码应该是 404。

谢谢!

4

2 回答 2

5

您需要将 Http 标头定义为具有 404 状态。

return HttpResponse(content=template.render(context), content_type='text/html; charset=utf-8', status=404)

通知搜索引擎当前页面是 404 是很重要的。垃圾邮件发送者有时会创建许多看起来会引导您到某个地方的 url,但随后会为您提供其他内容。他们经常使许多不同的地址为您提供几乎完全相同的内容。而且由于它对用户不友好,因此大多数 SEO 指南都会对此进行处罚。因此,如果您有很多地址显示相同的伪 404 内容,那么搜索网站的爬虫系统可能会看起来不太好。因此,您要确保用作自定义 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-26T14:03:24.337 回答
0

你可以

return HttpResponseNotFound(render_to_string('404.html')) 

反而。

于 2012-12-30T01:05:42.763 回答