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

Aks*_*ngh 10 python django rest django-rest-framework

我正在学习Django Rest Framework,也是django的新手.我想404在客户端访问未找到的资源时在json中返回自定义错误.

urls.py看起来很喜欢这个:

urlpatterns = [
    url(r'^mailer/$', views.Mailer.as_view(), name='send-email-to-admin')
]
Run Code Online (Sandbox Code Playgroud)

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

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

{
    "status_code" : 404
    "error" : "The resource was not found"
}
Run Code Online (Sandbox Code Playgroud)

如果合适,请使用正确的代码段建议一些答案.

Ern*_*Ten 15

你在找handler404.

这是我的建议:

  1. 如果没有任何URL模式匹配,则创建应该调用的视图.
  2. 添加handler404 = path.to.your.view到您的根URLconf.

以下是它的完成方式:

  1. project.views

    from django.http import JsonResponse
    
    
    def custom404(request, exception=None):
        return JsonResponse({
            'status_code': 404,
            'error': 'The resource was not found'
        })
    
    Run Code Online (Sandbox Code Playgroud)
  2. project.urls

    from project.views import custom404
    
    
    handler404 = custom404
    
    Run Code Online (Sandbox Code Playgroud)

阅读错误处理了解更多详情.

Django REST框架异常也可能很有用.

  • 您还应该包含状态代码 404:`JsonResponse({'detail': "The resource was not found", 'status_code': 404}, status=404)` (2认同)

小智 6

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

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

IE :

urlpatterns = [
url(r'^mailer/$', views.Mailer.as_view(), name='send-email-to-admin'),
url(r'^.*/$',views.Error404.as_view(),name='error404')]
Run Code Online (Sandbox Code Playgroud)