Cuando un usuario escribe una dirección url que está mal, mi aplicación de Django devuelve un error HTML. ¿Cómo puedo obtener DRF para devolver un json con formato de error?

Actualmente mi url es

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),
]

pero si un usuario va a 127.0.0.1:8000/snip Que obtener el código html formateado por error en vez de una con el formato json error.

InformationsquelleAutor Kei Nagase | 2017-02-03

1 Comentario

  1. 19

    Simplemente la forma de hacerlo, puede utilizar raise Http404, aquí está su 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)

    Usted también puede manejar con Response(status=status.HTTP_404_NOT_FOUND), esta respuesta es cómo hacer con él: https://stackoverflow.com/a/24420524/6396981

    Pero previamente, en el interior de su 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)

    Para probarlo, un ejemplo del uso de curl comando;

    $ curl -X GET http://localhost:8000/snippets/<pk>/
    
    # example;
    
    $ curl -X GET http://localhost:8000/snippets/99999/

    La esperanza puede ayudar..


    Actualización

    Si quieres manejar para todos los de error 404 url con DRF, DRF también proporcionan sobre ella con APIException, esta respuesta puede ayudar a usted; https://stackoverflow.com/a/30628065/6396981

    Me voy a dar un ejemplo de cómo hacer con él;

    1. views.py

    from rest_framework.exceptions import NotFound
    
    def error404(request):
        raise NotFound(detail="Error 404, page not found", code=404)

    2. urls.py

    from django.conf.urls import (
      handler400, handler403, handler404, handler500)
    
    from yourapp.views import error404
    
    handler404 = error404

    Makesure su DEBUG = False

    • Pero, ¿cómo usted obtiene un mensaje de error 404 con localhost:8000/snip
    • humb veo… por favor, compra de mi actualización…
    • esta probado con DEBUG=FALSE nada puedo obtener una 500 estado @SancaKembang

Dejar respuesta

Please enter your comment!
Please enter your name here