Django,当我返回 status_code 404 或 500 时自定义 404/500

Posted

技术标签:

【中文标题】Django,当我返回 status_code 404 或 500 时自定义 404/500【英文标题】:Django, custom 404/500 for when i return status_code 404 or 500 【发布时间】:2017-10-16 21:13:45 【问题描述】:

我为我的 Django 应用程序编写了自定义 404/500 页面,它们工作正常,除非我从我的视图中显式返回状态码为 500 或 404 的响应。

在后一种情况下,我会得到响应中返回的任何内容。我知道我可以在这些响应中呈现我的 404 和 500 模板,但是有没有办法自动使用这些 404/500 页面?

为了说明我的问题:

当请求被发送到“http://my.host/pattern_not_matching_anything”时,我的 404.html 页面就好了。

但是,当在http://my.host/valid_pattern/invalid_parameter"处收到无效请求时,即调用我的视图时,我在数据库中查找参数并没有找到它,因此我返回了适当的响应:

return HttpResponse("not found", status_code=404)

返回的 HTML 页面仅包含“未找到”,而我希望它呈现我自定义的完整 404 模板。

【问题讨论】:

另一种方法是返回对内置错误视图之一的调用;例如return django.views.defaults.server_error(request). 【参考方案1】:

您应该引发Http404 异常,而不是返回带有status_code=404 的响应:

from django.http import 

def my_view(request, slug):
    try:
        obj = MyModel.object.get(slug=slug)
    except MyModel.DoesNotExist:
        raise Http404

    ...

这是 Django 中的常见模式,因此您可以使用 get_object_or_404 快捷方式。

from django.shortcuts import get_object_or_404

def my_view(request, slug):
    obj = get_object_or_404(MyModel, slug=slug)
    ...

状态码 500 表示您的服务器出现问题。您不应故意返回状态码为 500 的响应。

【讨论】:

这种方法的问题是我们想在向用户返回 500 之前捕获某些错误并用它们做不同的事情,在我们对它们做了一些事情之后重新引发异常似乎很奇怪,因此我们只返回错误响应。 如果您的应用程序捕获到异常,那么我认为您不应该返回状态代码 500,因为可能有更好、更具体的错误代码。如果你真的想返回状态码 500,那么重新引发异常,Django 会捕获它并渲染你的 500 模板。 @Ibolit 请不要对重新引发异常感到奇怪,它在 python 中得到完全支持,并且具有有效的用例。具体在Django's exception middleware为你处理这些特殊异常,你可以customize the views it renders。

以上是关于Django,当我返回 status_code 404 或 500 时自定义 404/500的主要内容,如果未能解决你的问题,请参考以下文章

requests01_嵩山

Django 多注解返回错误结果

如何使用 django 进行 http 获取

Django:BooleanField 返回“on”而不是 true?

如何在django中保存多个到多个字段

[WHERE列=值,仅适用于INTEGER值