如何在 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】:在您的视图处理程序中返回 HttpResponseGone
,HttpResponse
的子类。
【讨论】:
【参考方案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(或做类似的事情)?