2015-06-05 11 views
9

Mam następujący kod widokiem DRF:Django Reszta ramowa: pusty request.data

from rest_framework import viewsets 

class MyViewSet(viewsets.ViewSet): 

    def update(self, request, pk = None): 
     print pk 
     print request.data 

Wzywam URL poprzez Pythona wniosków w następujący sposób:

import requests 
payload = {"foo":"bar"} 
headers = {'Content-type': 'application/json'} 
r = requests.put("https://.../myPk", data= payload, headers=headers) 

, ale gdy żądanie zostanie odebrane z serwera, request.data jest pusty. Tutaj jest wyjście:

myPk 
<QueryDict: {}> 

Jak mogę rozwiązać ten problem?

+0

Spróbuj użyć requests.post – Mikeec3

+0

Mikeec3 doc z ram prac spoczynku mówi: _request.data zwraca przeanalizowaną zawartość treści żądania. Jest to podobne do standardowych atrybutów request.POST i request.FILES z wyjątkiem: - Obejmuje całą przeanalizowaną treść, w tym dane wejściowe plików i plików. ** - Obsługuje przetwarzanie zawartości metod HTTP innych niż POST, co oznacza, że ​​można uzyskać dostęp do zawartości żądań PUT i PATCH. ** - Obsługuje elastyczne przetwarzanie żądań REST, a nie tylko wspiera dane formularzy. Na przykład możesz obsłużyć przychodzące dane JSON w taki sam sposób, w jaki przetwarzasz przychodzące dane formularzy._ – floatingpurr

Odpowiedz

11

Musisz wysłać payload jako zserializowany obiekt json.

import json 
import requests 
payload = {"foo":"bar"} 
headers = {'Content-type': 'application/json'} 
r = requests.put("https://.../myPk/", data=json.dumps(payload), headers=headers) 

W przeciwnym razie, co się dzieje, że DRF rzeczywiście narzekać:

*** ParseError: JSON parse error - No JSON object could be decoded 

będzie można zobaczyć, że komunikat o błędzie przez debugowania widoku (np pdb lub ipdb) lub drukowania zmiennej takiego:

def update(self, request, pk = None): 
    print pk 
    print str(request.data) 
+0

Próbowałem serializować słownik jako json, ale nadal nie działa. Kiedy czytam wydruk wartości var, otrzymuję zawsze 'myPk' i' '. – floatingpurr

+0

Jakie dane wyjściowe otrzymasz, gdy wykonasz 'print request.stream.read()' zamiast 'print request.data' (ważne jest, aby usunąć' print request.data' dla tego testu). Powinno to pokazać niezmienione nieprzetworzone dane z twojego żądania. Czy widzisz tam coś? [.stream w dokumentacji] (http://www.django-rest-framework.org/api-guide/requests/#stream) – sthzg

+0

Dodałem wiersz 'print request.stream.read() 'natychmiast po' def update (self, request, pk = None): '. Wyjście to: 'AttributeError: obiekt 'NoneType' nie ma atrybutu 'read'' – floatingpurr

1

Zakładając, że jesteś na tyle nowych wersji wniosków trzeba zrobić:

Następnie poprawnie sformatuje ładunek i dostarczy odpowiednie nagłówki. W przeciwnym razie wysyłasz application/x-www-urlformencoded dane, których DRF nie będzie poprawnie analizował, ponieważ powiesz mu, że wysyłasz JSON.

+0

Ok, ale określam format w 'headers = {'Content-type': 'application/json'}' – floatingpurr

2

Sprawdź tutaj 2 problemy: -

  1. formacie JSON jest właściwe czy nie.
  2. URL jest poprawny, czy nie (brakowało mi końcowe ukośnik w moim url którego bo w obliczu problemu)

nadzieję, że pomoże

Powiązane problemy