2013-04-25 13 views
8

Próbuję zrobić Post używając zwijania:Django & TastyPie: request.POST jest pusty

curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"item_id": "1"}' http://www.mylocal.com:8000/api/1/bookmarks/ 

Jednak request.POST jest zawsze pusty.

Poniżej jest mój kod ModelResource:

class BookmarkResource(ModelResource): 


    class Meta: 
     queryset = Bookmark.objects.all()  
     resource_name = 'bookmarks' 
     fields = ['id', 'tags'] 
     allowed_methods = ['get', 'post', 'delete', 'put'] 
     always_return_data = True 
     authorization= Authorization() 
     include_resource_uri = False 

    def determine_format(self, request): 
     return "application/json" 

    def obj_create(self, bundle, **kwargs): 

     request = bundle.request 

     try: 
      payload = simplejson.loads(request.POST.keys()[0]) 
     except: 
      payload = simplejson.loads(request.POST.keys()) 

ktoś wie o co mi brakuje?

Z góry dziękuję.

Odpowiedz

29

Począwszy od Django 1.5, POST nie zawiera już danych nieformalnych. Są teraz w request.body.

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.POST

+0

Zobacz również http://stackoverflow.com/questions/1208067/wheres-my-json-data-in-my-incoming-django-request. – Seth

+1

@dannyroa Co odróżnia "dane formularzy" od "danych nieformalnych"? – rrauenza

+1

... Patrząc na źródło Django, wygląda na to, że jest zdefiniowany w '_load_post_and_files()' i zależy od 'CONTENT_TYPE' -' multipart/form-data' oraz 'application/x-www-form-urlencoded' – rrauenza

0

Nie jestem cURL spodziewać, ale kopiowanie żądania POST z Chrome dev narzędzi mój --data wyglądały następująco:

--data "foo=bar&bar=foo"

Wygląda więc na to może chcesz zmienić komendę:

--data item_id="1"

notatka: bardzo polecam jedną z followin g Chrome aplikacje do wykonywania żądań http:

Advanced REST client LUB Dev HTTP Client

Dodatkowo, jeśli można wykonać połączenie w przeglądarce (forma przedstawienia lub takiego jak), a następnie w Chrome panelu sieciowym narzędzia dev można skopiować wniosek jako Polecenie cURL (kliknij prawym przyciskiem myszy)

+0

Próbowałem REST Client Chrome App i miałem ten sam problem. – dannyroa

+0

Czy próbowałeś pdb/ipdb, aby zobaczyć, co jest dostępne na 'request'? – rockingskier

+0

Tak, użyłem ipdb do prześledzenia tego. W REST Client ustawiam Content-Type na "application/json". – dannyroa

Powiązane problemy