Django:自定义404处理程序返回404状态代码

问题描述:

我正在处理的项目有一些数据需要传递给每个视图,所以我们有一个围绕render_to_response的包装,称为master_rtr。好。Django:自定义404处理程序返回404状态代码

现在,我需要我们的404页来贯穿这一点。根据the instructions,我创建了一个调用master_rtr的自定义404处理程序(巧妙地称为custom_404)。一切看起来不错,但我们的测试失败了,因为我们收到了200 OK。

所以,我试图找出如何返回404状态代码,而不是。有seems to be HttpResponseNotFound类,这是有点我想要的,但我不太清楚如何构建所有的废话,而不是使用render_to_response。或者说,我可能会想出来,但似乎他们一定是一个更简单的方法;在那儿?

代码的相应部分:


def master_rtr(request, template, data = {}): 
    if request.user.is_authenticated(): 
    # Since we're only grabbing the enrollments to get at the courses, 
    # doing select_related() will save us from having to hit database for 
    # every course the user is enrolled in 
    data['courses'] = \ 
    [e.course for e in \ 
    Enrollment.objects.select_related().filter(user=request.user) \ 
    if e.view] 
    else: 
    if "anonCourses" in request.session: 
    data['courses'] = request.session['anonCourses'] 
    else: 
    data['courses'] = [] 

    data['THEME'] = settings.THEME 

    return render_to_response(template, data, context_instance=RequestContext(request)) 

def custom_404(request): 
    response = master_rtr(request, '404.html') 
    response.status_code = 404 
    return response 

最简单的办法:

def custom_404(request): 
    response = master_rtr(...) 
    response.status_code = 404 
    return response 

但我要问:你为什么不只是使用一个上下文处理器用的RequestContext沿将数据传递给视图?

+0

啊,是的,这就是我一直在寻找的。用代码更新了问题。 – 2010-02-22 20:27:32

+1

那么它绝对看起来像你可以只是在上下文处理器(然后将其添加到TEMPLATE_CONTEXT_PROCESSORS设置)。 如果您担心丢失使用RequestContext的简单快捷方式,则可以使用django.views.generic.simple.direct_to_template – SmileyChris 2010-02-23 00:48:44

到应用程序的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) 

的秘密是在最后一行:状态= 404

希望它帮助!