Django Rest Framework如何返回在所有无效网址上找不到的详细信息?

时间:2016-03-15 16:19:29

标签: python django django-rest-framework

Django 1.7

DRF 3.3.2

Python 2.7

每当我输入无效网址时,我都希望使用{'detail': 'Not found'.}返回404回复。

但是,只有当我输入一个包含无效查找参数的有效网址时,我才会收到此信息。

例如,如果我发出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错误:

enter image description here

会破坏我的应用。

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

更新

给定答案将为整个项目设置自定义404视图(所有aps)。

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

的myapp / urls.py

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

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

1 个答案:

答案 0 :(得分:2)

您可以编写自定义404视图并将其分配给django' s 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)