【问题标题】:Django: custom 404 handler that returns 404 status codeDjango:返回 404 状态码的自定义 404 处理程序
【发布时间】:2011-01-19 11:24:49
【问题描述】:

我正在处理的项目有一些数据需要传递给每个视图,所以我们有一个围绕render_to_response 的包装器,称为master_rtr。好的。

现在,我也需要我们的 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

【问题讨论】:

    标签: django http-status-code-404


    【解决方案1】:

    简单的方法:

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

    但我不得不问:为什么不直接使用上下文处理器和 RequestContext 将数据传递给视图?

    【讨论】:

    • 啊,是的,这就是我要找的。用代码更新了问题。
    • 好吧,看起来您可以在上下文处理器中执行此操作(然后将其添加到 TEMPLATE_CONTEXT_PROCESSORS 设置中)。如果您担心丢失使用 RequestContext 的更简单的快捷方式,您可以使用 django.views.generic.simple.direct_to_template
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      进入你应用的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

      希望对您有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-16
        • 2018-04-05
        • 2014-05-19
        相关资源
        最近更新 更多