2010-02-22 2 views
1

Проект, над которым я работаю, содержит некоторые данные, которые необходимо передать каждому виду, поэтому у нас есть обертка вокруг render_to_response под названием master_rtr. ОК.Django: пользовательский обработчик 404, который возвращает код состояния 404

Теперь мне нужны наши 404 страницы, чтобы справиться с этим. Per the instructions, я создал пользовательский обработчик 404 (умно называется custom_404), который вызывает master_rtr. Все выглядит хорошо, но наши тесты терпят неудачу, потому что мы получаем 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

Ах да, это то, что я искал. Обновлен вопрос с кодом. –

+1

Ну, это определенно похоже, что вы можете просто сделать это в процессоре контекста (а затем добавить его в настройку TEMPLATE_CONTEXT_PROCESSORS). Если вы опасаетесь потерять более простой ярлык, который использует RequestContext, вы можете просто использовать django.views.generic.simple.direct_to_template – SmileyChris

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

Надеется, что это помогло!

Смежные вопросы