Sto provando a scrivere un gestore di API di Django Rest Framework che può ricevere un file e un carico utile JSON. Ho impostato il MultiPartParser come parser del gestore.Utilizzando Django Rest Framework, come posso caricare un file E inviare un carico utile JSON?
Tuttavia, sembra che non sia possibile fare entrambe le cose. Se invio il payload con il file come richiesta multiparte, il carico utile JSON è disponibile in modo distorto nel request.data (prima parte del testo fino ai primi due punti come chiave, il resto è i dati). Posso inviare i parametri nei parametri del modulo standard, ma il resto della mia API accetta i payload JSON e volevo essere coerente. Il request.body non può essere letto in quanto solleva *** RawPostDataException: You cannot access body after reading from request's data stream
Ad esempio, un file e questo payload nel corpo della richiesta:
{"title":"Document Title", "description":"Doc Description"}
diventa:
<QueryDict: {u'fileUpload': [<InMemoryUploadedFile: 20150504_115355.jpg (image/jpeg)>, <InMemoryUploadedFile: Front end lead.doc (application/msword)>], u'{%22title%22': [u'"Document Title", "description":"Doc Description"}']}>
C'è un modo per fare questo? Posso mangiare la mia torta, tenerla e non guadagnare peso?
Modifica: È stato suggerito che questa potrebbe essere una copia di Django REST Framework upload image: "The submitted data was not a file". Non è. Il caricamento e la richiesta vengono eseguiti in multipart, e tieni presente il file e il caricamento di esso va bene. Posso persino completare la richiesta con variabili di forma standard. Ma voglio vedere se riesco a ottenere un carico utile JSON in là invece.
possibile duplicato del [Django REST quadro l'immagine di upload: "I dati presentati non era un file"] (http: //stackoverflow.com/questions/28036404/django-rest-framework-upload-image-the-submitted-data-was-not-a-file) –
No, non è così. domanda modificata per spiegare perché, anche se non vedo nemmeno la somiglianza tra le due domande oltre al bit di upload del file. – Harel
È importante notare che _'application/json' non è lo stesso di 'multipart/form-data'_, non possono essere usati insieme. E JSON non supporta il caricamento dei file per impostazione predefinita, è necessario utilizzare un campo file personalizzato (e codificare Base64) per ottenere il supporto per il caricamento dei file (che è il punto in cui arriva l'altra domanda). Non è possibile inviare JSON con dati multipart, poiché multipart non può analizzare JSON affatto e JSON non può analizzare multipart. –