Django 404页面返回200状态码

5
我正在学习Django教程的第五部分:测试。我遇到了一个问题,当我使用DetailView和ListView“快捷”视图来因式分解代码(如教程中建议的那样)时,当显示404页面时,返回的是200状态码。我做错了什么吗?教程说状态码应该是404。

谢谢!


这个问题如果附上一些代码会更有帮助。 - Lev Levitsky
谢谢您的回复。我已经解决了!现在发布回复。 - yuechen
1
糟糕,看来 StackOverflow 不允许我在 8 小时内回答自己的问题。那我就在这里发表吧:我为 404 页面创建了自己的视图(即通过设置 handler404 = views.my_404_view)。然而,我的 404 视图使用了“render”快捷方式,因此总是返回 200 状态码。我不应该使用这个快捷方式,而是应该在返回 HttpResponse 之前设置 response.status_code。一旦我注释掉了我的 handler404,一切都按预期工作了。 - yuechen
使用Django中的http404。是的,如果您直接提供404.html,它会被视为200,正如您所理解的那样,我刚刚为您点了赞。尝试发布您的解决方案? - CppLearner
2个回答

5
你需要定义 Http header 以设置 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

希望这有所帮助!

期待社区对这种方法的贡献。=)


0

你可以

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

取而代之。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接