当用户输入错误的url时,我的Django应用程序返回一个HTML错误.如何让DRF返回json格式的错误?

目前我的网址是

from django.conf.urls import url
from snippets import views

urlpatterns = [
    url(r'^snippets/$', views.snippet_list),
    url(r'^snippets/(?P<pk>[0-9]+)/$', views.snippet_detail),
]

但是如果用户转到127.0.0.1:8000/snip,他们得到的是html格式的错误,而不是json格式的错误.

推荐答案

简单地说,你可以用raise Http404,这是你的views.py

from django.http import Http404

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

from yourapp.models import Snippet
from yourapp.serializer import SnippetSerializer


class SnippetDetailView(APIView):

    def get_object(self, pk):
        try:
            return Snippet.objects.get(pk=pk)
        except Snippet.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data, status=status.HTTP_200_OK)

你也可以用Response(status=status.HTTP_404_NOT_FOUND)来处理它,这个答案是如何处理它:https://stackoverflow.com/a/24420524/6396981

但之前,在你的serializer.py

from rest_framework import serializers

from yourapp.models import Snippet


class SnippetSerializer(serializers.ModelSerializer):
    user = serializers.CharField(
        source='user.pk',
        read_only=True
    )
    photo = serializers.ImageField(
        max_length=None,
        use_url=True
    )
    ....

    class Meta:
        model = Snippet
        fields = ('user', 'title', 'photo', 'description')

    def create(self, validated_data):
        return Snippet.objects.create(**validated_data)

为了测试它,给出了一个使用curl命令的例子;

$ curl -X GET http://localhost:8000/snippets/<pk>/

# example;

$ curl -X GET http://localhost:8000/snippets/99999/

希望它能帮上忙.


更新

如果您想用DRF处理所有错误404URL,DRF还提供了关于它的APIException,这个答案可能会对您有帮助;https://stackoverflow.com/a/30628065/6396981

我将举一个例子说明如何处理它;

1. 100

from rest_framework.exceptions import NotFound

def error404(request):
    raise NotFound(detail="Error 404, page not found", code=404)

2. 100

from django.conf.urls import (
  handler400, handler403, handler404, handler500)

from yourapp.views import error404

handler404 = error404

确保你的DEBUG = False

Django相关问答推荐

查尔而不是瓦尔查尔加盟Django 球场

使用django直接计算geohash而不创建模型

Django ORM Groupby

在生产中添加整型主键

注册新用户时,对象没有属性';is_active';错误:';NoneType';对象没有属性

过滤查询以获取两个朋友之间的聊天消息?

dj_rest_auth 中的 PyTest 警告- RemovedInDjango40Warning: django.conf.urls.url() 已弃用,取而代之的是 django.urls.re_path()

断开连接不会发生

在 Django 模板中呈现标签名称而不是整数字段

Playframework 和 Django

获取结果集中返回的元素数的 django 模板标签是什么?

在 Django 的 TextField 中禁用 HTML 转义

Django REST Framework - 将额外参数传递给操作

django - 如何在验证之前处理/清理字段

手动触发 Django 邮件错误报告

在 Django 管理页面中注册应用程序中的每个表/类

Django 什么是反向关系?

如何使用查询参数构造 Django 反向/url?

如何使 Django 表单字段仅包含字母数字字符

django select_related - 何时使用它