Django自定义handler404显示404,但给出标题200

Ger*_*dJP 8 django http-status-code-404

我为经过身份验证的Django网站制作了一个自定义handler404,以避免信息泄露.

def check_logged_in_404(request):
    """ Custom 404. Show friendly 404 when logged in and redirect to /login
    when not logged in.
    """
    if request.user.is_authenticated():
        return render_to_response('404.html')
    else:
        return HttpResponseRedirect('/login')
Run Code Online (Sandbox Code Playgroud)

在功能上它完全符合我的要求.但是,404返回页面的状态为200,这是正确的代码方式.但这显然需要成为404返回状态.

raise404不起作用,因为如果不以无限递归结束,它会返回到此处,从而导致相同的问题.

我尝试了一个HttpResponseNotFound,但这只是一个字符串作为参数而不是模板,这不是DRY-ish.

我手动尝试设置标题:

    response = render_to_response('404.html')
    response['Status'] = "Not Found - 404"
    return response
Run Code Online (Sandbox Code Playgroud)

然后确实设置了状态标题,但浏览器仍然显示200.

我没有选择..任何有提示的人,请成为我的英雄...... :)

Thanx和问候,

杰拉德.

编辑:我尝试了所有排序btw状态字段值,但没有运气:(

Cat*_*lus 21

我会用render_to_stringHttpResponseNotFound,如return HttpResponseNotFound(render_to_string('404.html')).


Ger*_*dJP 12

我终于找到了为什么返回的状态代码不起作用.它不是设置标题消息,而是:

response.status_code = 404
Run Code Online (Sandbox Code Playgroud)

尽管如此,PiotrLegnica建议的代码肯定会在简单性,可读性和美感上获胜.徽章仍然存在;)

问候,

杰拉德.


小智 7

根据上面的建议,这是我的404,500处理程序的简短版本:

def handler404(request):
    response = render_to_response('404.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 404
    return response


def handler500(request):
    response = render_to_response('500.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 500
    return response
Run Code Online (Sandbox Code Playgroud)