【问题标题】:Django Rest Framework how to return detail not found on all invalid urls?Django Rest Framework 如何返回在所有无效 url 上找不到的详细信息?
【发布时间】:2016-07-01 05:08:10
【问题描述】:

Django 1.7

DRF 3.3.2

Python 2.7

每当我输入无效的 url 时,我想返回一个带有 {'detail': 'Not found'.} 的 404 响应。

但是,只有当我输入带有无效查找参数的有效 url 时,我才会得到这个。

例如,如果我在以下位置发出 GET 请求:

http://127.0.0.1:8000/api/boxes/3e1659f3-9238-4b8f-a580-9b096d95bbfa/

我会得到请求的对象。

如果我做同样的事情:

http://127.0.0.1:8000/api/boxes/3e1659f3-9238-4b8f-a580-9b096d95bbfajibbersihherelalalalalalala/

我会在正文中收到带有{'detail': 'Not found'.} 消息的 404。

如果我用这个网址尝试同样的事情:

http://127.0.0.1:8000/api/boxesevenbiggerjibberish

我会得到一个带有这个错误的 404:

这会破坏我的应用程序。

所以问题是,我如何设置我的网址,以便使用{'detail': 'Not found'.} 消息处理每个无效的网址(这不会破坏我的应用程序)。

更新

给定的答案将为您的整个项目(所有应用程序)设置自定义 404 视图。

如果您想为项目中的特定应用程序设置自定义 404(例如,您希望 API 返回 json,但希望您的应用程序返回一些自定义模板),那么您可以设置一个 urlpattern 来捕获所有内容:

myapp/urls.py

urlpatterns = [
    ...,
    ...,
    url(r'^.*/$', views.error_page, name='error_page')
]

确保 url 是最后一个模式(否则每个 url 都会调用您的自定义 error_page 视图)。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您可以编写自定义 404 视图并将其分配给 django 的handler404。这可能看起来像这样(未经测试):

    urls.py

    from django.conf.urls import handler404
    from myapp import views
    
    handler404 = views.error_page
    

    views.py

    from rest_framework.decorators import api_view
    from rest_framework import status
    
    @api_view()
    def error_page(request):
        return Response({'detail': 'Not found'}, status=status.HTTP_404_NOT_FOUND)
    

    【讨论】:

    • @BoldMarshmallow,为什么你认为api_view 不起作用?
    • 我很抱歉,它确实有效。昨天由于某种原因它破坏了我的代码,但现在我再次检查它,一切似乎都很好。我一定是在别处犯了错误。
    • 对于其他遇到此问题的人,您还应该在设置中设置 Debug = False 以使其正常工作。
    猜你喜欢
    • 2018-02-13
    • 2020-10-11
    • 2020-11-06
    • 1970-01-01
    • 2014-11-13
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    相关资源
    最近更新 更多