2014-09-09 7 views
8

I został zbudowany Django API, które po podaniu adresu e-mail za pośrednictwem POST odpowie wartość logiczną wskazującą, czy nie pogoda, że ​​adres e-mail już istnieje w mojej bazy danych:Dlaczego ta dokumentacja API interfejsu API Django-Rest-Swagger nie działa poprawnie?

class isEmailTaken(views.APIView): 
    permission_classes = [permissions.AllowAny,] 

    def post(self, request, *args, **kwargs): 
     try: 
      email = request.DATA['email'] 
     except KeyError: 
      return HttpResponse(
       'An email was not given with this request.', 
       status=status.HTTP_400_BAD_REQUEST, 
      ) 
     return HttpResponse(
      json.dumps(
       User.objects.filter(email=email), 
       content_type="application/json", 
       status=status.HTTP_200_OK, 
      ) 
     ) 

Teraz chciałbym użyć django-rest-swagger pakiet do automatycznego generowania dokumentacji dla tego API. Zainstalowałem paczkę i wstawiłem komentarze, które widzisz powyżej między potrójnymi cytatami. Kiedy patrzę na dokumentację stworzoną przez django-rest-swagger dla tego API, widzę obraz poniżej.

enter image description here

Jednak po kliknięciu przycisku Try it out!, otrzymuję błąd pokazany poniżej. Warto zauważyć, że nigdy nie daje mi ona możliwości wprowadzenia argumentu e-mail, który powinien wysłać za pośrednictwem POST.

enter image description here

Dlaczego nie Django Swagger-Package tworzyć dokumenty, które pozwalają mi właściwie argument "email" poprzez POST? Jak mogę to zrobić?

+4

Do dwóch osób, które nie głosują: Jak to pytanie jest niejasne lub nieużyteczne? Dlaczego powiedziałbyś, że pokazuje brak badań. Wyjaśniłem, co próbowałem zrobić. Oprogramowanie nie działa tak jak w reklamie i pytam dlaczego. Wydaje się, że jest to całkowicie uzasadnione pytanie, dla którego stworzono StackOverflow. –

+0

Czy możesz wydrukować żądanie i obiekty request.DATA tuż przed instrukcją return, abyśmy mogli zobaczyć, co tu się dzieje? – Norman8054

+0

Norman, zredagowałem oryginalne pytanie, aby dołączyć dwie nowe instrukcje dziennika. Tutaj możesz zobaczyć dane wyjściowe: https://gist.github.com/syedsaqibali/b2f825c8234df77a9e7a –

Odpowiedz

11

testowałem to z cigar_example która jest wykonana przez Django Rest-puszyć i w tym przykładzie napisane jedną custom view który również nie jest renderowania Parametry wejściowe

Wreszcie patrzę w kodzie źródłowym i stwierdził, że django-rest- swagger musi get_serializer_class zbudować parametry ciała

tak to działało z następującego kodu

class isEmailTaken(views.APIView): 
    permission_classes = [permissions.AllowAny,] 
    serializer_class = IsEmailTakenSerializer 

def get_serializer_class(self): 
    return self.serializer_class 

def post(self, request, *args, **kwargs): 
    try: 
     email = request.DATA['email'] 
    except KeyError: 
     return HttpResponse(
      'An email was not given with this request.', 
      status=status.HTTP_400_BAD_REQUEST, 
     ) 
    return HttpResponse(
     json.dumps(
      User.objects.filter(email=email), 
      content_type="application/json", 
      status=status.HTTP_200_OK, 
     ) 
     ) 

i IsEmailTakenSerializer

from rest_framework import serializers 
class IsEmailTakenSerializer(serializers.Serializer): 
    email = serializers.EmailField() 
+0

Dzięki Venkatesh! Dam to spróbować w ciągu najbliższych 12 godzin. Zakładając, że to działa (i myślę, że tak będzie), dam ci punkty za bounty w tym czasie. –

+0

To spowodowało błąd: nazwa 'fields' nie jest zdefiniowana w IsEmailTakenSerializer. Czy jest tu literówka? –

+0

@SaqibAli Zaktualizowałem odpowiedź, proszę, spróbuj jeszcze raz –

1

django-rest-swagger próbuje wysłać żądanie POST bez niektórych danych.

Najpierw trzeba naprawić swój pogląd tak:

from rest_framework import status 
from django.http import HttpResponse 
import json 

def post(self, request, *args, **kwargs): 
    try: 
     email = request.DATA['email'] 
    except KeyError: 
     return HttpResponse(
      'An email was not given with this request.', 
      status=status.HTTP_400_BAD_REQUEST, 
     ) 
    return HttpResponse(
     json.dumps(
      User.objects.filter(email=email), 
      content_type="application/json", 
      status=status.HTTP_200_OK, 
     ) 
    ) 

Jeśli spróbujesz to powinien pojawić się komunikat o błędzie piękny teraz.

Następnym krokiem jest obejrzenie dokumentacji Django-rest-swagger, aby dowiedzieć się, co zrobić, aby renderować pole formularza HTML bezpośrednio nad przyciskiem "Wypróbuj".

+0

To z pewnością pomaga trochę. Dzięki. –

+0

Edytowałem oryginalne pytanie, tak aby zawierało rozwiązanie Normana i skupiało się na wciąż nierozstrzygniętej części pytania. –