2013-04-25 15 views
8

Ich versuche, eine POST Locke zu tun:Django & TastyPie: request.POST ist leer

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

jedoch request.POST immer leer ist.

Unten ist mein modelresource Code:

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()) 

Jeder weiß, was ich bin fehlt?

Vielen Dank im Voraus.

Antwort

29

Ab Django 1.5 enthält der POST keine Nicht-Formulardaten mehr. Sie sind jetzt in request.body.

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

+0

Siehe auch http://stackoverflow.com/questions/1208067/wheres-my-json-data-in-my-incoming-django-request. – Seth

+1

@dannyroa Was unterscheidet "Formulardaten" und "Nichtformdaten"? – rrauenza

+1

... Betrachtet man die Django-Quelle, sieht es so aus, als wäre sie in '_load_post_and_files()' definiert und hängt von 'CONTENT_TYPE' -' multipart/form-data' und 'application/x-www-form-urlencoded' ab – rrauenza

0

Ich bin kein cURL erwartet aber eine POST-Anforderung von Chrome Entwickler-Tool zu kopieren meine --data wie folgt aussahen:

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

So sieht es aus wie Sie möchten vielleicht auf Ihren Befehl ändern:

--data item_id="1"

Randbemerkung: ich kann sehr entweder der followin empfehlen g Chrome-Apps für die Herstellung von HTTP-Anfragen:

Advanced REST client ODER Dev HTTP Client

Zusätzlich, wenn Sie den Anruf in einem Browser machen können (Formular oder dergleichen), dann in Chrome Entwickler-Tools Netzwerk-Panel können Sie die Anfrage als Kopie cURL-Befehl (Rechtsklick darauf)

+0

habe ich versucht, einen REST-Client-App für Chrome & ich hatte das gleiche Problem. – dannyroa

+0

Haben Sie versucht, pdb/ipdb zu sehen, was auf Anfrage verfügbar ist? – rockingskier

+0

Ja, ich habe ipdb verwendet, um es zu verfolgen. Auf dem REST-Client habe ich den Inhaltstyp auf "application/json" gesetzt. – dannyroa

Verwandte Themen