如何在 Django 中引发 410 错误

Posted

技术标签:

【中文标题】如何在 Django 中引发 410 错误【英文标题】:How to raise a 410 error in Django 【发布时间】: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 异常?我希望能够在任何地方提出这个例外,而不仅仅是在我看来。谢谢!

【问题讨论】:

【参考方案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 会更好,因为有时您需要在远离视图函数的深层嵌套函数调用中执行此操作。

以上是关于如何在 Django 中引发 410 错误的主要内容,如果未能解决你的问题,请参考以下文章

python Django(极端情况):如何在FormView(CreateView / UpdateView)的form_valid方法中引发表单无效并添加错误消息

如何修复 django 错误 MultiValueDictKeyError

如何在 Django 的 views.py 中引发 ValidationError(或做类似的事情)?

Cassandra 用户定义类型上的 Django Queryset 引发类型错误

在表单中的特定字段上引发 Django 中的错误

Django Admin 在生产 Heroku 中引发 500 错误