首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Django Rest框架中找不到资源时返回自定义404错误

在Django Rest框架中找不到资源时返回自定义404错误
EN

Stack Overflow用户
提问于 2015-07-13 09:54:21
回答 3查看 12.4K关注 0票数 14

我正在学习Django Rest框架,也是django的新手。当客户端访问未找到的资源时,我希望返回json中的自定义404错误。

我的urls.py看起来像这样:

代码语言:javascript
运行
复制
urlpatterns = [
    url(r'^mailer/$', views.Mailer.as_view(), name='send-email-to-admin')
]

,其中我只有一个资源,可以通过URI、http://localhost:8000/mailer/访问。

现在,当客户端访问任何其他URI (如http://localhost:8000/ )时,API应该返回一个404-Not Found错误,如下所示:

代码语言:javascript
运行
复制
{
    "status_code" : 404
    "error" : "The resource was not found"
}

如果合适的话,请用适当的代码片段建议一些答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-13 10:35:40

你在找handler404

以下是我的建议:

  1. 如果URL模式不匹配,则创建一个应该调用的视图。
  2. handler404 = path.to.your.view添加到根URLconf中。

这是如何做到的:

  1. project.views 从django.http导入JsonResponse def custom404(request,exception=None):返回JsonResponse({ 'status_code':404,'error':‘没有找到资源’})
  2. project.urls 从project.views导入custom404 handler404 = custom404

有关更多细节,请阅读错误处理

Django REST框架例外可能也很有用。

票数 20
EN

Stack Overflow用户

发布于 2015-07-13 10:28:43

根据django文档: Django按照顺序遍历每个URL模式,并在与请求的URL匹配的第一个URL处停止。参考文献:https://docs.djangoproject.com/en/1.8/topics/http/urls/

因此,您可以在您创建的urlpatterns之后添加另一个url,它应该匹配所有url模式,并将它们发送到返回404代码的视图中。

即:

代码语言:javascript
运行
复制
urlpatterns = [
url(r'^mailer/$', views.Mailer.as_view(), name='send-email-to-admin'),
url(r'^.*/$',views.Error404.as_view(),name='error404')]
票数 6
EN

Stack Overflow用户

发布于 2021-05-28 11:25:46

@Ernest的答案是正确的。但是,如果您使用的是同时处理浏览器页面加载和API作为调用的应用程序,我想添加一些输入。

我将custom404函数自定义为

代码语言:javascript
运行
复制
def custom404(request, exception=None):
    requested_html = re.search(r'^text/html', request.META.get('HTTP_ACCEPT')) # this means requesting from browser to load html
    api = re.search(r'^/api', request.get_full_path()) # usually, API URLs tend to start with `/api`. Thus this extra check. You can remove this if you want.

    if requested_html and not api:
        return handler404(request, exception) # this will handle error in the default manner

    return JsonResponse({
        'detail': _('Requested API URL not found')
    }, status=404, safe=False)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31380280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档