【问题标题】:How to raise a 410 error in Django如何在 Django 中引发 410 错误
【发布时间】:2011-05-11 15:35:25
【问题描述】:

我想为我的一些 Django 页面返回 410 错误,而不是返回 404。基本上,我不想调用raise Http404('some error message'),而是调用raise Http410('some error message') 快捷方式。

我很困惑,因为在 django.http 中,函数 Http404 很简单:

class Http404(Exception):
    pass

所以如果我做同样的事情并创建我的 Http410 函数,我会假设它看起来像:

class Http410(Exception):
    pass

但是,这样做会返回异常,但会提供 500 错误页面。如何重现 Http404 异常的魔力?我应该注意,我需要从我的模型(而不是视图)中引发异常,所以我不能只返回一个 HttpResponseGone。

提前致谢!

更新: 我完全了解 HttpResponseGone 并在我最初的问题中提到了这一点。我已经知道如何在我的视图中返回它。我的问题是:如何引发 Http 410 异常,类似于引发 Http 404 异常?我希望能够在任何地方提出这个例外,而不仅仅是在我看来。谢谢!

【问题讨论】:

    标签: python django error-handling httpresponse http-status-code-410


    【解决方案1】:
    from django.http import HttpResponse
    return HttpResponse(status=410)
    

    【讨论】:

      【解决方案2】:

      在您的视图处理程序中返回 HttpResponseGoneHttpResponse 的子类。

      【讨论】:

        【解决方案3】:

        Django 不包含此机制,因为消失应该是正常的工作流程,而不是错误条件,但如果您不想将其视为返回响应,并且作为异常,只需实现 middleware

        class MyGoneMiddleware(object):
            def process_exception(self, request, exception):
                if isinstance(exception, Http410):
                    return HttpResponseGone("Gone!")
                return None
        

        【讨论】:

        • @Spike 为什么不能只返回 HttpResponseGone 对象而不是引发异常并让中间件注入该对象?
        • 我决定只返回一个 HttpResponseGone 对象,因为这似乎是做事的正常方式。不过,我将您的答案标记为已回答,因为您回答了我最初提出的确切问题。
        • @Santa 使用 raise 而不是 return 会更好,因为有时您需要在远离视图函数的深层嵌套函数调用中执行此操作。
        猜你喜欢
        • 2018-02-22
        • 2012-05-14
        • 2017-12-16
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-23
        相关资源
        最近更新 更多