2015-06-05 7 views
9

ho il seguente codice per una vista di DRF:Django Riposo quadro: request.data vuoto

from rest_framework import viewsets 

class MyViewSet(viewsets.ViewSet): 

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

io chiamo l'URL via python-richieste nel seguente modo:

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

ma quando la richiesta viene ricevuta dal server, request.data è vuoto. Qui c'è l'output:

myPk 
<QueryDict: {}> 

Come posso risolvere questo problema?

+0

Prova utilizzando requests.post – Mikeec3

+0

Mikeec3 il doc di framwork riposo dice: _request.data restituisce il contenuto analizzato del corpo della richiesta. Questo è simile alla richiesta standard. Attributi POST e request.FILES tranne che: - Include tutto il contenuto analizzato, inclusi gli input di file e non file. ** - Supporta l'analisi del contenuto dei metodi HTTP diversi dal POST, il che significa che è possibile accedere al contenuto delle richieste PUT e PATCH. ** - Supporta l'analisi flessibile delle richieste del framework REST, piuttosto che il solo supporto dei dati del modulo. Ad esempio, puoi gestire i dati JSON in entrata nello stesso modo in cui gestisci i dati dei moduli in arrivo. – floatingpurr

risposta

11

È necessario inviare lo payload come oggetto serializzato json.

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

Altrimenti ciò che accade è che DRF effettivamente lamentarsi:

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

Si vedrebbe che il messaggio di errore di debug la vista (ad esempio con pdb o ipdb) o la stampa la variabile in questo modo:

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

Ho provato a serializzare il dizionario come un json ma non funziona ancora. Quando leggo la stampa dei valori var ottengo sempre 'myPk' e' '. – floatingpurr

+0

Quale output si ottiene quando si esegue 'print request.stream.read()' invece di 'print request.data' (è importante rimuovere' print request.data' per quel test). Questo dovrebbe mostrarti i dati grezzi inalterati dalla tua richiesta. Vedi qualcosa lì? [.stream in the docs] (http://www.django-rest-framework.org/api-guide/requests/#stream) – sthzg

+0

Ho aggiunto la riga 'print request.stream.read() 'immediatamente dopo' def update (self, request, pk = None): '. L'output è: 'AttributeError: 'NoneType' l'oggetto non ha attributo 'read'' – floatingpurr

1

supponendo che si sta su una nuova versione abbastanza di richieste che devi fare:

import requests 

payload = {"foo":"bar"} 
r = requests.put("https://.../myPk", json=payload, headers=headers) 

Quindi formatterà correttamente il carico utile per voi e fornirà le intestazioni appropriate. Altrimenti, invierai i dati application/x-www-urlformencoded che DRF non analizzerà correttamente poiché gli dici che stai inviando JSON.

+0

Ok, ma specificherò il formato in 'headers = {'Content-type': 'application/json'}' – floatingpurr

2

Check 2 edizioni qui: -

  1. formato JSON è corretta o meno.
  2. URL è corretta o meno (mi mancava finale backslash nel mio URL per cui stavo affrontando la questione)

Speranza che aiuta