2010-02-22 149 views
1

我正在處理的項目有一些數據需要傳遞給每個視圖,所以我們有一個圍繞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 

回答

9

最簡單的辦法:

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

0

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

希望它幫助!

相關問題