2013-04-25 17 views
8

Sto cercando di fare un post con ricciolo:Django & TastyPie: request.POST è vuoto

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

Tuttavia, request.POST è sempre vuoto.

Qui di seguito è il mio codice 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()) 

Chiunque sa che cosa mi manca?

Grazie in anticipo.

risposta

29

A partire da Django 1.5, il POST non contiene più dati non in formato. Sono ora in richiesta. Corpo.

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

+0

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

+1

@dannyroa Che cosa differenzia "dati di modulo" e "dati non di forma"? – rrauenza

+1

... Guardando il sorgente di Django, sembra che sia definito in '_load_post_and_files()' e dipende da 'CONTENT_TYPE' -' multipart/form-data' e 'application/x-www-form-urlencoded' – rrauenza

0

Io non sono un ricciolo aspettare, ma la copia di una richiesta POST di strumenti di sviluppo Chrome mia --data sembrava come segue:

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

così sembra che si potrebbe desiderare di cambiare il comando:

--data item_id="1"

Nota a margine: consiglio vivamente sia del followin g Chrome apps per effettuare richieste HTTP:

Advanced REST client O Dev HTTP Client

Inoltre se è possibile effettuare la chiamata in un browser (modulo di inviare o simili) poi in Chrome pannello di rete strumenti di sviluppo è possibile copiare la richiesta come un comando cURL (fai clic con il pulsante destro del mouse)

+0

ho provato un REST client Chrome App e ho avuto lo stesso problema. – dannyroa

+0

Hai provato pdb/ipdb per vedere cosa è disponibile su 'request'? – rockingskier

+0

Sì, ho usato ipdb per tracciarlo. Nel client REST, ho impostato Content-Type su "application/json". – dannyroa

Problemi correlati