【问题标题】:Django handler500 as a Class Based ViewDjango handler500 作为基于类的视图
【发布时间】:2012-11-29 19:47:01
【问题描述】:

为什么这不起作用

handler500 = TemplateView.as_view(template_name="500.html")

我得到以下异常:

Traceback (most recent call last):
  File "/usr/lib/python2.6/wsgiref/handlers.py", line 94, in run    
    self.finish_response()
  File "/usr/lib/python2.6/wsgiref/handlers.py", line 134, in finish_response
    for data in self.result:
  File "/home/hatem/projects/leadsift_app/.virtualenv/lib/python2.6/site-packages/django/template/response.py", line 117, in __iter__
    raise ContentNotRenderedError('The response content must be 'ContentNotRenderedError: The response content must be rendered before it can be iterated over.

我发现这个set of notes 描述了你正在用自己的脚开枪以在那里使用基于类的视图,这是为什么呢?

编辑:我最终使用了这个......但我仍然希望有人能告诉我如何让原来的 oneliner 或类似的工作

class Handler500(TemplateView):
    template_name = "500.html"  
    @classmethod
    def as_error_view(cls):
        v = cls.as_view()
        def view(request):
            r = v(request)
            r.render()
            return r
        return view
handler500 = Handler500.as_error_view()

【问题讨论】:

    标签: python django error-handling custom-error-pages


    【解决方案1】:

    我认为它实际上非常简单(在 Django 1.7 和 Python 3.4 中):

    views.py

    ​​>
    from django.http import HttpResponse
    from django.views.generic.base import View
    
    class Custom500View(View):
        def dispatch(self, request, *args, **kwargs):
            return HttpResponse('My custom django 500 page')
    

    urls.py

    ​​>
    from .views import Custom500View
    
    handler500 = Custom500View.as_view()
    

    【讨论】:

    • 你真的测试过这个吗?如果您在我的问题中看到第一个 sn-p 正是您所说的(在一行而不是 3 行)。它不起作用,因为错误视图需要一个简单的处理程序......除非它在最新版本的 Django 中得到修复,否则您的答案将不起作用。
    • 我实际上正在使用它(使用 Django 1.7)。我的使用方式略有不同,因为我的 500 视图生成的是 JSON 而不是 HTML。这就是为什么我发布这样的答案而不是使用TemplateView
    • 作为旁注,我也在使用Python 3.4。我看到在wsgiref 库中的Python 2.6 中引发了原始错误。也许这实际上是一个 Python 问题,而不是 Django。
    • 应该和python的版本无关,只和django的版本有关。基本上,错误视图传递的参数比正常视图所期望的要少。
    • 那么您使用的是哪个 Django 版本?似乎这可能是“在我的机器上工作”的一些情况。 :P
    【解决方案2】:

    我宁愿在 vanilla Django 中使用 500 个带有静态 HTML 的库存模板,然后用代码做任何事情。这是我认为不应触碰的一种切换方式。

    【讨论】:

    • 除非您具有呈现视图所需的最少上下文(例如,基于设备加载模板,具有错误报告表单等)。这并不真正构成答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2014-02-16
    • 2018-05-14
    • 2014-02-21
    • 2011-11-15
    • 1970-01-01
    • 2020-12-25
    相关资源
    最近更新 更多