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沿将数据传递给视图?
答
到应用程序的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
希望它帮助!
啊,是的,这就是我一直在寻找的。用代码更新了问题。 – 2010-02-22 20:27:32
那么它绝对看起来像你可以只是在上下文处理器(然后将其添加到TEMPLATE_CONTEXT_PROCESSORS设置)。 如果您担心丢失使用RequestContext的简单快捷方式,则可以使用django.views.generic.simple.direct_to_template – SmileyChris 2010-02-23 00:48:44