Django: пользовательский обработчик 404, который возвращает код состояния 404 - PullRequest
1 голос
/ 22 февраля 2010

В проекте, над которым я работаю, есть некоторые данные, которые необходимо передать каждому представлению, поэтому у нас есть обертка вокруг render_to_response, называемая master_rtr. Хорошо.

Теперь мне нужно пройти через наши 404 страницы. В соответствии с инструкциями , я создал собственный обработчик 404 (умно названный custom_404), который вызывает master_rtr. Все выглядит хорошо, но наши тесты не пройдены, потому что мы получаем обратно 200 OK.

Итак, я пытаюсь выяснить, как вернуть код состояния 404. , кажется, класс 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

Ответы [ 3 ]

10 голосов
/ 22 февраля 2010

Простой способ:

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

Но я должен спросить: почему вы не используете контекстный процессор вместе с RequestContext для передачи данных в представления?

1 голос
/ 22 февраля 2010

Просто установите status_code в ответе .

0 голосов
/ 26 апреля 2013

В 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

Надеюсь, это помогло!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...